# -*- coding: utf-8 -*-
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
*
* Copyright (c) 2020-2020  ACEINNA 
* Wuxi ACEINNA Sensing Technology.版权所有 2020-2020
*
* PROPRIETARY RIGHTS of ACEINNA Company are involved in the  　　　　　　
* subject matter of this material.  All manufacturing, reproduction, use,
* and sales rights pertaining to this subject matter are governed by the
* license agreement.  The recipient of this software implicitly accepts
* the terms of the license.
* 本软件文档资料是新纳公司的资产,任何人士阅读和使用本资料必须获得
* 相应的书面授权,承担保密责任和接受相应的法律约束.
*
********************************************************************************
* File Name          : rtk_upload.py
* Author             : dch
* Revision           : 1.0 
* Date               : 09/05/2015
* Description        : rtk upgrade thread
*
* HISTORY***********************************************************************
* 09/05/2020  | created                                | dch
*
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
import serial
import binascii
from time import sleep
import os 
import sys
import time



xldr_teseo5_bootloader_cut2 = \
[
  0x01, 0xf0, 0x3c, 0xbc, 0x3d, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00,
  0x3d, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00,
  0xfe, 0xe7, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0d, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x54, 0x45, 0x53, 0x45, 0x4f, 0x56, 0x5f, 0x32, 0x58, 0x5f, 0x58, 0x4c,
  0x5f, 0x31, 0x5f, 0x38, 0x5f, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x02, 0xf8,
  0x00, 0xf0, 0x58, 0xf8, 0x0a, 0xa0, 0x90, 0xe8, 0x00, 0x0c, 0x82, 0x44,
  0x83, 0x44, 0xaa, 0xf1, 0x01, 0x07, 0xda, 0x45, 0x01, 0xd1, 0x00, 0xf0,
  0x4d, 0xf8, 0xaf, 0xf2, 0x09, 0x0e, 0xba, 0xe8, 0x0f, 0x00, 0x13, 0xf0,
  0x01, 0x0f, 0x18, 0xbf, 0xfb, 0x1a, 0x43, 0xf0, 0x01, 0x03, 0x18, 0x47,
  0xe8, 0x1c, 0x00, 0x00, 0x18, 0x1d, 0x00, 0x00, 0x0a, 0x44, 0x10, 0xf8,
  0x01, 0x4b, 0x14, 0xf0, 0x0f, 0x05, 0x08, 0xbf, 0x10, 0xf8, 0x01, 0x5b,
  0x24, 0x09, 0x08, 0xbf, 0x10, 0xf8, 0x01, 0x4b, 0x6d, 0x1e, 0x05, 0xd0,
  0x10, 0xf8, 0x01, 0x3b, 0x6d, 0x1e, 0x01, 0xf8, 0x01, 0x3b, 0xf9, 0xd1,
  0x64, 0x1e, 0x03, 0xd0, 0x64, 0x1e, 0x01, 0xf8, 0x01, 0x5b, 0xfb, 0xd1,
  0x91, 0x42, 0xe4, 0xd3, 0x70, 0x47, 0x00, 0x00, 0x10, 0x3a, 0x24, 0xbf,
  0x78, 0xc8, 0x78, 0xc1, 0xfa, 0xd8, 0x52, 0x07, 0x24, 0xbf, 0x30, 0xc8,
  0x30, 0xc1, 0x44, 0xbf, 0x04, 0x68, 0x0c, 0x60, 0x70, 0x47, 0x00, 0x00,
  0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x10, 0x3a, 0x28, 0xbf,
  0x78, 0xc1, 0xfb, 0xd8, 0x52, 0x07, 0x28, 0xbf, 0x30, 0xc1, 0x48, 0xbf,
  0x0b, 0x60, 0x70, 0x47, 0x1f, 0xb5, 0x1f, 0xbd, 0x10, 0xb5, 0x10, 0xbd,
  0xdf, 0xf8, 0x0c, 0xd0, 0xff, 0xf7, 0xf8, 0xff, 0x01, 0xf0, 0x5c, 0xf9,
  0x01, 0xf0, 0x78, 0xfb, 0x00, 0x00, 0x01, 0x20, 0x03, 0xb4, 0xff, 0xf7,
  0xf1, 0xff, 0x03, 0xbc, 0x01, 0xf0, 0x7a, 0xfb, 0x7c, 0xb5, 0x06, 0x46,
  0x5e, 0x48, 0x0d, 0x46, 0x00, 0x68, 0x84, 0x08, 0x30, 0x46, 0x00, 0xf0,
  0xc2, 0xff, 0x00, 0x21, 0x2a, 0x46, 0x03, 0x20, 0x0b, 0x46, 0xcd, 0xe9,
  0x00, 0x01, 0x21, 0x46, 0x30, 0x46, 0x01, 0xf0, 0x07, 0xf9, 0x04, 0x21,
  0x30, 0x46, 0x01, 0xf0, 0x62, 0xf8, 0x01, 0x21, 0x30, 0x46, 0x01, 0xf0,
  0x75, 0xf8, 0x30, 0x46, 0x00, 0xf0, 0xe5, 0xff, 0x30, 0x46, 0x01, 0xf0,
  0x86, 0xf8, 0x30, 0x46, 0x01, 0xf0, 0x88, 0xf8, 0x30, 0x46, 0xbd, 0xe8,
  0x7c, 0x40, 0x01, 0xf0, 0x88, 0xb8, 0x70, 0xb5, 0x14, 0x46, 0x0d, 0x46,
  0x06, 0x46, 0x09, 0xe0, 0x30, 0x46, 0x01, 0xf0, 0x54, 0xfb, 0x28, 0xb9,
  0x15, 0xf8, 0x01, 0x1b, 0x30, 0x46, 0x01, 0xf0, 0x56, 0xfb, 0x64, 0x1e,
  0x00, 0x2c, 0xf3, 0xd1, 0x70, 0xbd, 0x70, 0xb5, 0x14, 0x46, 0x0d, 0x46,
  0x06, 0x46, 0x09, 0xe0, 0x30, 0x46, 0x01, 0xf0, 0x46, 0xfb, 0x28, 0xb9,
  0x30, 0x46, 0x01, 0xf0, 0x48, 0xfb, 0x64, 0x1e, 0x05, 0xf8, 0x01, 0x0b,
  0x00, 0x2c, 0xf3, 0xd1, 0x70, 0xbd, 0xf8, 0xb5, 0x14, 0x46, 0x0d, 0x46,
  0x06, 0x46, 0x07, 0xe0, 0x01, 0xcd, 0x04, 0x22, 0x69, 0x46, 0x00, 0x90,
  0x30, 0x46, 0xff, 0xf7, 0xd0, 0xff, 0x64, 0x1e, 0x00, 0x2c, 0xf5, 0xd1,
  0xf8, 0xbd, 0x08, 0xb5, 0xff, 0x20, 0x00, 0x90, 0x01, 0x20, 0x00, 0xf0,
  0xd2, 0xfd, 0xf5, 0x20, 0x00, 0xf0, 0x0c, 0xf9, 0xff, 0x20, 0x00, 0xf0,
  0x09, 0xf9, 0x06, 0x20, 0x00, 0xf0, 0x06, 0xf9, 0x01, 0x22, 0x69, 0x46,
  0x81, 0x20, 0x00, 0xf0, 0xdc, 0xf9, 0x06, 0x20, 0x00, 0xf0, 0xfe, 0xf8,
  0x01, 0x22, 0x69, 0x46, 0x61, 0x20, 0x00, 0xf0, 0xd4, 0xf9, 0x00, 0xf0,
  0x20, 0xfb, 0x08, 0xbd, 0x38, 0xb5, 0x0c, 0x46, 0x05, 0x46, 0x00, 0x20,
  0x69, 0x46, 0x00, 0x92, 0x04, 0x22, 0x01, 0xf0, 0xb1, 0xf8, 0x00, 0x9a,
  0x29, 0x46, 0x01, 0xf0, 0xad, 0xf8, 0x84, 0x42, 0x01, 0xd1, 0x00, 0x20,
  0x38, 0xbd, 0x01, 0x20, 0x38, 0xbd, 0x41, 0x6a, 0x39, 0xb1, 0x41, 0x6a,
  0x01, 0x29, 0x21, 0xd0, 0x40, 0x6a, 0x01, 0x28, 0x26, 0xd9, 0x01, 0x20,
  0x70, 0x47, 0x01, 0x68, 0x00, 0x29, 0x02, 0xdc, 0x41, 0x7d, 0x00, 0x29,
  0xf7, 0xd0, 0x41, 0x68, 0x02, 0x29, 0xf4, 0xd8, 0x01, 0x7d, 0x01, 0x29,
  0xf1, 0xd8, 0x41, 0x7d, 0x01, 0x29, 0xee, 0xd8, 0x81, 0x7d, 0x01, 0x29,
  0xeb, 0xd8, 0xc1, 0x7d, 0x01, 0x29, 0xe8, 0xd8, 0x01, 0x7e, 0x01, 0x29,
  0xe5, 0xd8, 0xc1, 0x69, 0x00, 0x29, 0xe2, 0xdb, 0x00, 0x6a, 0x05, 0xe0,
  0x81, 0x6a, 0x01, 0x29, 0xdd, 0xd8, 0x81, 0x6a, 0x11, 0xb9, 0x00, 0x6b,
  0x00, 0x28, 0xd8, 0xdd, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x00, 0x20,
  0x2a, 0xb1, 0x01, 0x2a, 0x02, 0xd1, 0x02, 0x69, 0x0a, 0x43, 0x02, 0x61,
  0x70, 0x47, 0x02, 0x69, 0x8a, 0x43, 0xfa, 0xe7, 0x5a, 0xb1, 0x01, 0x2a,
  0x0c, 0xd0, 0x02, 0x2a, 0x11, 0xd0, 0x03, 0x2a, 0x0e, 0xd1, 0x02, 0x6a,
  0x0a, 0x43, 0x02, 0x62, 0x42, 0x6a, 0x0a, 0x43, 0x07, 0xe0, 0x02, 0x6a,
  0x8a, 0x43, 0x01, 0xe0, 0x02, 0x6a, 0x0a, 0x43, 0x02, 0x62, 0x42, 0x6a,
  0x8a, 0x43, 0x42, 0x62, 0x70, 0x47, 0x02, 0x6a, 0x8a, 0x43, 0xee, 0xe7,
  0x00, 0x21, 0x01, 0x60, 0x0f, 0x22, 0xc2, 0x60, 0x81, 0x61, 0x81, 0x62,
  0x81, 0x63, 0x81, 0x64, 0x70, 0x47, 0x00, 0xeb, 0x01, 0x10, 0x10, 0xb5,
  0x81, 0x69, 0x02, 0x9c, 0x62, 0xf3, 0x41, 0x01, 0x81, 0x61, 0x81, 0x69,
  0x63, 0xf3, 0x83, 0x01, 0x81, 0x61, 0x00, 0x2c, 0x05, 0xd0, 0x81, 0x69,
  0x01, 0x2c, 0x03, 0xd0, 0x41, 0xf0, 0x40, 0x01, 0x81, 0x61, 0x10, 0xbd,
  0x41, 0xf0, 0x01, 0x01, 0xfa, 0xe7, 0x00, 0x00, 0x33, 0x4a, 0x01, 0x46,
  0x00, 0x20, 0x2d, 0x29, 0x04, 0xd0, 0x01, 0x23, 0x20, 0x29, 0x06, 0xd2,
  0x12, 0x6c, 0x06, 0xe0, 0x91, 0x6c, 0x00, 0x29, 0x00, 0xda, 0x01, 0x20,
  0x70, 0x47, 0xd2, 0x6e, 0x20, 0x39, 0x8b, 0x40, 0x1a, 0x42, 0xf8, 0xd1,
  0x70, 0x47, 0x29, 0x49, 0x2d, 0x28, 0x0a, 0xd0, 0x01, 0x22, 0x20, 0x28,
  0x0c, 0xd2, 0x0b, 0x6c, 0x82, 0x40, 0x13, 0x43, 0x0b, 0x64, 0x48, 0x6c,
  0x10, 0x43, 0x48, 0x64, 0x70, 0x47, 0x88, 0x6c, 0x40, 0xf0, 0x40, 0x40,
  0x88, 0x64, 0x70, 0x47, 0xcb, 0x6e, 0x20, 0x38, 0x82, 0x40, 0x13, 0x43,
  0xcb, 0x66, 0x08, 0x6f, 0x10, 0x43, 0x08, 0x67, 0x70, 0x47, 0x1b, 0x49,
  0x2d, 0x28, 0x07, 0xd0, 0x01, 0x22, 0x82, 0x40, 0x20, 0x28, 0x08, 0xd2,
  0x48, 0x6c, 0x90, 0x43, 0x48, 0x64, 0x70, 0x47, 0x88, 0x6c, 0x20, 0xf0,
  0x80, 0x40, 0x88, 0x64, 0x70, 0x47, 0x08, 0x6f, 0x90, 0x43, 0x08, 0x67,
  0x70, 0x47, 0x11, 0x49, 0x2d, 0x28, 0x07, 0xd0, 0x01, 0x22, 0x82, 0x40,
  0x20, 0x28, 0x08, 0xd2, 0x48, 0x6c, 0x10, 0x43, 0x48, 0x64, 0x70, 0x47,
  0x88, 0x6c, 0x40, 0xf0, 0x80, 0x40, 0x88, 0x64, 0x70, 0x47, 0x08, 0x6f,
  0x10, 0x43, 0x08, 0x67, 0x70, 0x47, 0x4f, 0xf0, 0x90, 0x40, 0x41, 0x69,
  0x21, 0xf4, 0x80, 0x11, 0x41, 0x61, 0x41, 0x69, 0xc9, 0x02, 0xfc, 0xd4,
  0x41, 0x69, 0x41, 0xf4, 0x80, 0x11, 0x41, 0x61, 0x70, 0x47, 0x00, 0x00,
  0x00, 0x40, 0x02, 0x50, 0x4f, 0xf0, 0x50, 0x41, 0xd1, 0xf8, 0x00, 0x21,
  0xc2, 0xf3, 0x02, 0x22, 0x02, 0x2a, 0x01, 0xd0, 0x03, 0x2a, 0x05, 0xd1,
  0xd1, 0xf8, 0x00, 0x31, 0x23, 0xf4, 0xe0, 0x63, 0xc1, 0xf8, 0x00, 0x31,
  0xd1, 0xf8, 0x00, 0x31, 0x60, 0xf3, 0x07, 0x03, 0xc1, 0xf8, 0x00, 0x31,
  0xd1, 0xf8, 0x00, 0x01, 0x10, 0xf0, 0xff, 0x0f, 0xfa, 0xd1, 0x02, 0x2a,
  0x01, 0xd0, 0x03, 0x2a, 0x05, 0xd1, 0xd1, 0xf8, 0x00, 0x01, 0x62, 0xf3,
  0x0a, 0x20, 0xc1, 0xf8, 0x00, 0x01, 0x70, 0x47, 0x30, 0xb5, 0x4f, 0xf0,
  0x50, 0x44, 0x03, 0x25, 0xd4, 0xf8, 0x00, 0x01, 0xc0, 0xf3, 0x02, 0x20,
  0x04, 0x28, 0x07, 0xd1, 0xd4, 0xf8, 0x00, 0x01, 0x20, 0xf4, 0xe0, 0x40,
  0x00, 0xf5, 0x80, 0x40, 0xc4, 0xf8, 0x00, 0x01, 0x05, 0x20, 0xff, 0xf7,
  0xc5, 0xff, 0xd4, 0xf8, 0x08, 0x01, 0xc0, 0x07, 0x02, 0xd0, 0x01, 0x25,
  0x28, 0x46, 0x30, 0xbd, 0x2b, 0x20, 0xff, 0xf7, 0xbb, 0xff, 0xd4, 0xf8,
  0x08, 0x01, 0xc0, 0xb2, 0x10, 0xf0, 0x0c, 0x0f, 0x01, 0xd0, 0x02, 0x25,
  0x03, 0xe0, 0x10, 0xf0, 0x60, 0x0f, 0x00, 0xd1, 0x00, 0x25, 0xd4, 0xf8,
  0x00, 0x01, 0x20, 0xf4, 0xe0, 0x40, 0xc4, 0xf8, 0x00, 0x01, 0xe7, 0xe7,
  0x30, 0xb5, 0x03, 0x24, 0x70, 0x20, 0x4f, 0xf0, 0x50, 0x45, 0xff, 0xf7,
  0xa1, 0xff, 0xd5, 0xf8, 0x08, 0x01, 0xc0, 0xb2, 0x01, 0x06, 0x0d, 0xd5,
  0x10, 0xf0, 0x44, 0x0f, 0x01, 0xd0, 0x02, 0x24, 0x09, 0xe0, 0x10, 0xf0,
  0x3a, 0x0f, 0x03, 0xd0, 0x50, 0x20, 0xff, 0xf7, 0x91, 0xff, 0x02, 0xe0,
  0x00, 0x24, 0x00, 0xe0, 0x01, 0x24, 0x20, 0x46, 0x30, 0xbd, 0x10, 0xb5,
  0x05, 0x20, 0x4f, 0xf0, 0x50, 0x44, 0xff, 0xf7, 0x85, 0xff, 0xd4, 0xf8,
  0x08, 0x01, 0xc0, 0xb2, 0x01, 0x06, 0x01, 0xd5, 0x01, 0x20, 0x10, 0xbd,
  0x10, 0xf0, 0x0c, 0x00, 0xfb, 0xd0, 0x02, 0x20, 0x10, 0xbd, 0x10, 0xb5,
  0x05, 0x20, 0x4f, 0xf0, 0x50, 0x44, 0xff, 0xf7, 0x73, 0xff, 0xd4, 0xf8,
  0x08, 0x01, 0xc0, 0x07, 0x01, 0xd0, 0x01, 0x20, 0x10, 0xbd, 0x35, 0x20,
  0xff, 0xf7, 0x6a, 0xff, 0xd4, 0xf8, 0x08, 0x01, 0x00, 0x06, 0x01, 0xd5,
  0x02, 0x20, 0x10, 0xbd, 0x00, 0x20, 0x10, 0xbd, 0x10, 0xb5, 0x05, 0x20,
  0x4f, 0xf0, 0x50, 0x44, 0xff, 0xf7, 0x5c, 0xff, 0xd4, 0xf8, 0x08, 0x01,
  0xc0, 0x07, 0x01, 0xd0, 0x01, 0x20, 0x10, 0xbd, 0x35, 0x20, 0xff, 0xf7,
  0x53, 0xff, 0xd4, 0xf8, 0x08, 0x01, 0x00, 0x06, 0x01, 0xd5, 0x02, 0x20,
  0x10, 0xbd, 0x00, 0x20, 0x10, 0xbd, 0x10, 0xb5, 0x05, 0x20, 0x4f, 0xf0,
  0x50, 0x44, 0xff, 0xf7, 0x45, 0xff, 0xd4, 0xf8, 0x08, 0x01, 0xc0, 0x07,
  0x01, 0xd0, 0x01, 0x20, 0x10, 0xbd, 0x48, 0x20, 0xff, 0xf7, 0x3c, 0xff,
  0xd4, 0xf8, 0x08, 0x01, 0x10, 0xf0, 0x0c, 0x00, 0xf6, 0xd0, 0x02, 0x20,
  0x10, 0xbd, 0x4f, 0xf0, 0x50, 0x41, 0xd1, 0xf8, 0x00, 0x21, 0xd1, 0xf8,
  0x00, 0x21, 0x60, 0xf3, 0x07, 0x02, 0xc1, 0xf8, 0x00, 0x21, 0xd1, 0xf8,
  0x00, 0x01, 0x10, 0xf0, 0xff, 0x0f, 0xfa, 0xd1, 0x70, 0x47, 0x2d, 0xe9,
  0xf0, 0x41, 0x4f, 0xf0, 0x50, 0x44, 0xe2, 0xb3, 0xd3, 0x1c, 0xd4, 0xf8,
  0x00, 0x51, 0x4f, 0xea, 0x93, 0x0c, 0x00, 0x23, 0x4f, 0xea, 0x15, 0x68,
  0xd4, 0xf8, 0x04, 0x51, 0x2e, 0x0e, 0xd4, 0xf8, 0x00, 0x51, 0xc5, 0xf3,
  0x02, 0x35, 0x06, 0xe0, 0x80, 0xc9, 0x4f, 0xea, 0x37, 0x47, 0x7f, 0xba,
  0x44, 0xf8, 0x23, 0x70, 0x5b, 0x1c, 0x63, 0x45, 0xf6, 0xd3, 0xd4, 0xf8,
  0x00, 0x11, 0x21, 0xf0, 0x7f, 0x41, 0xc4, 0xf8, 0x00, 0x11, 0xd4, 0xf8,
  0x04, 0x11, 0x52, 0x1e, 0x62, 0xf3, 0x1f, 0x61, 0xc4, 0xf8, 0x04, 0x11,
  0xd4, 0xf8, 0x00, 0x11, 0x21, 0xf4, 0xe0, 0x41, 0x01, 0xf5, 0xa0, 0x41,
  0xc4, 0xf8, 0x00, 0x11, 0x77, 0x28, 0x17, 0xd0, 0xff, 0xf7, 0xee, 0xfe,
  0xd4, 0xf8, 0x04, 0x01, 0x66, 0xf3, 0x1f, 0x60, 0xc4, 0xf8, 0x04, 0x01,
  0xd4, 0xf8, 0x00, 0x11, 0x68, 0xf3, 0x1f, 0x61, 0x00, 0xe0, 0x0c, 0xe0,
  0xc4, 0xf8, 0x00, 0x11, 0xd4, 0xf8, 0x00, 0x01, 0x65, 0xf3, 0x0e, 0x30,
  0xc4, 0xf8, 0x00, 0x01, 0xbd, 0xe8, 0xf0, 0x81, 0xff, 0xf7, 0xa1, 0xff,
  0xe6, 0xe7, 0xfe, 0xe7, 0x2d, 0xe9, 0xf0, 0x4f, 0x4f, 0xf0, 0x50, 0x44,
  0x83, 0x46, 0xdd, 0xf8, 0x24, 0xc0, 0xbc, 0xf1, 0x00, 0x0f, 0x59, 0xd0,
  0x0c, 0xf1, 0x03, 0x00, 0xd4, 0xf8, 0x00, 0x51, 0x4f, 0xea, 0x90, 0x08,
  0x00, 0x20, 0x4f, 0xea, 0x15, 0x6a, 0xd4, 0xf8, 0x04, 0x51, 0x4f, 0xea,
  0x15, 0x69, 0xd4, 0xf8, 0x00, 0x51, 0xc5, 0xf3, 0x02, 0x36, 0xd4, 0xf8,
  0x18, 0x51, 0x06, 0xe0, 0x80, 0xcb, 0x4f, 0xea, 0x37, 0x47, 0x7f, 0xba,
  0x44, 0xf8, 0x20, 0x70, 0x40, 0x1c, 0x40, 0x45, 0xf6, 0xd3, 0xd4, 0xf8,
  0x00, 0x01, 0x20, 0xf4, 0xe0, 0x40, 0x00, 0xf5, 0x80, 0x50, 0xc4, 0xf8,
  0x00, 0x01, 0xd4, 0xf8, 0x00, 0x01, 0x20, 0xf0, 0x7f, 0x40, 0xc4, 0xf8,
  0x00, 0x01, 0xd4, 0xf8, 0x04, 0x01, 0xac, 0xf1, 0x01, 0x0c, 0x6c, 0xf3,
  0x1f, 0x60, 0xc4, 0xf8, 0x04, 0x01, 0xd4, 0xf8, 0x04, 0x01, 0x61, 0xf3,
  0x17, 0x00, 0xc4, 0xf8, 0x04, 0x01, 0xd4, 0xf8, 0x18, 0x01, 0x01, 0x2a,
  0x19, 0xd0, 0x20, 0xf4, 0x00, 0x40, 0xc4, 0xf8, 0x18, 0x01, 0xc4, 0xf8,
  0x14, 0x11, 0x04, 0xf5, 0x80, 0x74, 0x58, 0x46, 0xff, 0xf7, 0x82, 0xfe,
  0xa5, 0x61, 0x61, 0x68, 0x69, 0xf3, 0x1f, 0x61, 0x61, 0x60, 0x21, 0x68,
  0x6a, 0xf3, 0x1f, 0x61, 0x21, 0x60, 0x20, 0x68, 0x66, 0xf3, 0x0e, 0x30,
  0x20, 0x60, 0xbd, 0xe8, 0xf0, 0x8f, 0x40, 0xf4, 0x00, 0x40, 0xe4, 0xe7,
  0xfe, 0xe7, 0x2d, 0xe9, 0xf0, 0x47, 0x17, 0x00, 0x0d, 0x46, 0x4f, 0xf0,
  0x50, 0x44, 0x69, 0xd0, 0xd4, 0xf8, 0x00, 0x11, 0xc1, 0xf3, 0x02, 0x39,
  0xd4, 0xf8, 0x00, 0x11, 0x4f, 0xea, 0x11, 0x68, 0xd4, 0xf8, 0x04, 0x11,
  0x4f, 0xea, 0x11, 0x6c, 0xd4, 0xf8, 0x00, 0x11, 0x21, 0xf0, 0x7f, 0x41,
  0xc4, 0xf8, 0x00, 0x11, 0xd4, 0xf8, 0x04, 0x21, 0x79, 0x1e, 0x61, 0xf3,
  0x1f, 0x62, 0xc4, 0xf8, 0x04, 0x21, 0x04, 0x2f, 0x4f, 0xf0, 0x01, 0x0a,
  0x12, 0xd8, 0xd4, 0xf8, 0x00, 0x11, 0x21, 0xf4, 0xe0, 0x41, 0x01, 0xf5,
  0x00, 0x51, 0xc4, 0xf8, 0x00, 0x11, 0xff, 0xf7, 0x41, 0xfe, 0xd4, 0xf8,
  0x08, 0x11, 0xfa, 0x00, 0x0a, 0xfa, 0x02, 0xf0, 0x40, 0x1e, 0x01, 0x40,
  0x29, 0x60, 0x25, 0xe0, 0xf9, 0x1c, 0x8e, 0x08, 0xc7, 0xeb, 0x86, 0x01,
  0xc1, 0xf1, 0x04, 0x01, 0xc9, 0x00, 0x0a, 0xfa, 0x01, 0xf7, 0xd4, 0xf8,
  0x00, 0x11, 0x21, 0xf4, 0xe0, 0x41, 0x01, 0xf5, 0x40, 0x51, 0xc4, 0xf8,
  0x00, 0x11, 0x7f, 0x1e, 0xff, 0xf7, 0x24, 0xfe, 0x00, 0x20, 0x43, 0x1e,
  0x0c, 0xe0, 0x54, 0xf8, 0x20, 0x20, 0x40, 0x1c, 0xb0, 0x42, 0x01, 0xd1,
  0x19, 0x46, 0x00, 0xe0, 0x39, 0x46, 0x4f, 0xea, 0x32, 0x42, 0x52, 0xba,
  0x0a, 0x40, 0x04, 0xc5, 0xb0, 0x42, 0xf0, 0xd3, 0xd4, 0xf8, 0x04, 0x01,
  0x6c, 0xf3, 0x1f, 0x60, 0xc4, 0xf8, 0x04, 0x01, 0xd4, 0xf8, 0x00, 0x11,
  0x68, 0xf3, 0x1f, 0x61, 0xc4, 0xf8, 0x00, 0x11, 0xd4, 0xf8, 0x00, 0x11,
  0x69, 0xf3, 0x0e, 0x31, 0xc4, 0xf8, 0x00, 0x11, 0xbd, 0xe8, 0xf0, 0x87,
  0xfe, 0xe7, 0x30, 0xb5, 0x00, 0x78, 0x4f, 0xf0, 0x50, 0x44, 0x04, 0x28,
  0x07, 0xd0, 0x03, 0x25, 0xd4, 0xf8, 0x00, 0x01, 0xc0, 0xf3, 0x02, 0x20,
  0x04, 0x28, 0x02, 0xd0, 0x09, 0xe0, 0x02, 0x25, 0xf6, 0xe7, 0xd4, 0xf8,
  0x00, 0x01, 0x20, 0xf4, 0xe0, 0x40, 0x00, 0xf5, 0x80, 0x40, 0xc4, 0xf8,
  0x00, 0x01, 0x05, 0x20, 0xff, 0xf7, 0xe2, 0xfd, 0xd4, 0xf8, 0x08, 0x01,
  0x28, 0x42, 0xf8, 0xd1, 0xd4, 0xf8, 0x00, 0x01, 0x20, 0xf4, 0xe0, 0x40,
  0xc4, 0xf8, 0x00, 0x01, 0x30, 0xbd, 0x08, 0xb5, 0x4f, 0xf0, 0x50, 0x40,
  0x4c, 0xf2, 0x50, 0x31, 0x00, 0x91, 0xd0, 0xf8, 0x0c, 0x11, 0x41, 0xf0,
  0x80, 0x71, 0xc0, 0xf8, 0x0c, 0x11, 0xd0, 0xf8, 0x0c, 0x11, 0xc9, 0x01,
  0xfb, 0xd4, 0x00, 0x99, 0x4a, 0x1e, 0x00, 0x92, 0xfb, 0xd2, 0xd0, 0xf8,
  0x04, 0x11, 0x21, 0xf0, 0x7f, 0x41, 0xc0, 0xf8, 0x04, 0x11, 0xd0, 0xf8,
  0x00, 0x11, 0x21, 0xf4, 0xe0, 0x41, 0xc0, 0xf8, 0x00, 0x11, 0x08, 0xbd,
  0x1e, 0xb5, 0x04, 0x46, 0xff, 0x20, 0x01, 0x90, 0x21, 0x78, 0x01, 0x29,
  0x2d, 0xd0, 0x02, 0x29, 0x1a, 0xd0, 0x03, 0x29, 0x04, 0xd0, 0x04, 0x29,
  0x16, 0xd0, 0x0b, 0x29, 0x18, 0xd0, 0x24, 0xe0, 0x06, 0x20, 0xff, 0xf7,
  0xa3, 0xfd, 0x01, 0x22, 0x81, 0x20, 0x01, 0xa9, 0xff, 0xf7, 0x79, 0xfe,
  0x20, 0x46, 0xff, 0xf7, 0x9e, 0xff, 0x06, 0x20, 0xff, 0xf7, 0x98, 0xfd,
  0x01, 0x22, 0x61, 0x20, 0x01, 0xa9, 0xff, 0xf7, 0x6e, 0xfe, 0x10, 0xe0,
  0xff, 0x20, 0xff, 0xf7, 0x8f, 0xfd, 0x0c, 0xe0, 0x00, 0x24, 0x02, 0x94,
  0x06, 0x20, 0xff, 0xf7, 0x89, 0xfd, 0x01, 0x20, 0x21, 0x46, 0x02, 0xab,
  0x02, 0x46, 0x00, 0x90, 0x72, 0x20, 0xff, 0xf7, 0xad, 0xfe, 0xff, 0xf7,
  0xa8, 0xff, 0x1e, 0xbd, 0x7e, 0xb5, 0x01, 0x78, 0x4f, 0xf0, 0x50, 0x44,
  0x05, 0x46, 0x02, 0x29, 0x2c, 0xd0, 0x05, 0x29, 0x43, 0xd0, 0x01, 0x29,
  0x7f, 0xd0, 0x0b, 0x29, 0x7d, 0xd0, 0x00, 0x20, 0x06, 0x29, 0x6f, 0xd0,
  0x08, 0x29, 0x6e, 0xd0, 0x09, 0x29, 0xfc, 0xd0, 0x07, 0x29, 0x6b, 0xd0,
  0x0a, 0x29, 0xfc, 0xd0, 0x03, 0x29, 0x68, 0xd0, 0x04, 0x29, 0x6d, 0xd1,
  0x38, 0x20, 0xff, 0xf7, 0x5f, 0xfd, 0xd4, 0xf8, 0x00, 0x01, 0x20, 0xf4,
  0x7f, 0x00, 0x00, 0xf5, 0x30, 0x20, 0xc4, 0xf8, 0x00, 0x01, 0xd4, 0xf8,
  0x00, 0x01, 0x20, 0xf4, 0xe0, 0x60, 0x00, 0xf5, 0x80, 0x70, 0xc4, 0xf8,
  0x00, 0x01, 0xd4, 0xf8, 0x0c, 0x01, 0x20, 0xf4, 0x60, 0x30, 0x2d, 0xe1,
  0x05, 0x20, 0xff, 0xf7, 0x47, 0xfd, 0xd4, 0xf8, 0x08, 0x01, 0x04, 0xf5,
  0x80, 0x74, 0xc0, 0xb2, 0x00, 0x90, 0x35, 0x20, 0xff, 0xf7, 0x3e, 0xfd,
  0xa0, 0x68, 0x00, 0x99, 0xc0, 0xb2, 0x40, 0xf0, 0x02, 0x00, 0x41, 0xea,
  0x00, 0x20, 0x02, 0x90, 0x06, 0x20, 0xff, 0xf7, 0x33, 0xfd, 0x02, 0x22,
  0x6f, 0xe0, 0x05, 0x20, 0xff, 0xf7, 0x2e, 0xfd, 0xd4, 0xf8, 0x08, 0x01,
  0x04, 0xf5, 0x80, 0x74, 0xc0, 0xb2, 0x00, 0x90, 0x35, 0x20, 0xff, 0xf7,
  0x25, 0xfd, 0xa0, 0x68, 0xc6, 0xb2, 0x33, 0x20, 0xff, 0xf7, 0x20, 0xfd,
  0xa0, 0x68, 0x46, 0xf0, 0x02, 0x01, 0x00, 0x06, 0x00, 0x0a, 0x40, 0xea,
  0x01, 0x20, 0x00, 0x99, 0x08, 0x43, 0x02, 0x90, 0x06, 0x20, 0xff, 0xf7,
  0x13, 0xfd, 0x03, 0x22, 0x01, 0x20, 0x02, 0xa9, 0xff, 0xf7, 0xe9, 0xfd,
  0x28, 0x46, 0xff, 0xf7, 0x0e, 0xff, 0x20, 0x68, 0x20, 0xf4, 0x7f, 0x00,
  0x00, 0xf5, 0xd6, 0x00, 0x20, 0x60, 0x20, 0x68, 0x20, 0xf4, 0xe0, 0x60,
  0x00, 0xf5, 0x40, 0x70, 0xab, 0xe0, 0x0a, 0xe0, 0x1a, 0xe0, 0x53, 0xe0,
  0x86, 0xe0, 0xad, 0xe0, 0x04, 0xe0, 0xe0, 0x60, 0xe0, 0x68, 0x20, 0xf4,
  0x80, 0x20, 0xe0, 0x60, 0x7e, 0xbd, 0x05, 0x20, 0xff, 0xf7, 0xf0, 0xfc,
  0xd4, 0xf8, 0x08, 0x01, 0x04, 0xf5, 0x80, 0x74, 0xc0, 0xb2, 0x40, 0xf0,
  0x40, 0x00, 0x00, 0x90, 0x06, 0x20, 0xff, 0xf7, 0xe5, 0xfc, 0x01, 0x22,
  0x69, 0x46, 0x21, 0xe0, 0x01, 0x90, 0x05, 0x20, 0xff, 0xf7, 0xde, 0xfc,
  0xd4, 0xf8, 0x08, 0x01, 0x02, 0x22, 0x01, 0xa9, 0xc0, 0xb2, 0x00, 0x90,
  0x15, 0x20, 0x04, 0xf5, 0x80, 0x74, 0xff, 0xf7, 0x64, 0xfe, 0x00, 0x98,
  0x40, 0xf0, 0x40, 0x01, 0x01, 0x98, 0x00, 0x91, 0x00, 0xf4, 0x7f, 0x42,
  0xc0, 0xb2, 0x40, 0xf0, 0x02, 0x00, 0x42, 0xea, 0x00, 0x40, 0x08, 0x43,
  0x02, 0x90, 0x06, 0x20, 0xff, 0xf7, 0xc2, 0xfc, 0x03, 0x22, 0x02, 0xa9,
  0x01, 0x20, 0xff, 0xf7, 0x98, 0xfd, 0x28, 0x46, 0xff, 0xf7, 0xbd, 0xfe,
  0x20, 0x68, 0x20, 0xf4, 0x7f, 0x00, 0x00, 0xf5, 0x6b, 0x00, 0x20, 0x60,
  0x20, 0x68, 0x20, 0xf4, 0xe0, 0x60, 0x00, 0xf5, 0x00, 0x70, 0x20, 0x60,
  0xe0, 0x68, 0x20, 0xf4, 0x60, 0x30, 0x00, 0xf5, 0x80, 0x30, 0xae, 0xe7,
  0x01, 0x22, 0x69, 0x46, 0x01, 0x90, 0x05, 0x20, 0xff, 0xf7, 0x33, 0xfe,
  0x01, 0x22, 0x15, 0x20, 0x01, 0xa9, 0xff, 0xf7, 0x2e, 0xfe, 0xdd, 0xe9,
  0x00, 0x01, 0x40, 0xea, 0x01, 0x20, 0x40, 0xf0, 0x40, 0x00, 0x02, 0x90,
  0x06, 0x20, 0xff, 0xf7, 0x93, 0xfc, 0x02, 0x22, 0x01, 0x20, 0x02, 0xa9,
  0xff, 0xf7, 0x69, 0xfd, 0x28, 0x46, 0xff, 0xf7, 0x8e, 0xfe, 0xd4, 0xf8,
  0x00, 0x01, 0x20, 0xf4, 0x7f, 0x00, 0x00, 0xf5, 0x6b, 0x00, 0xc4, 0xf8,
  0x00, 0x01, 0xd4, 0xf8, 0x00, 0x01, 0x20, 0xf4, 0xe0, 0x60, 0x00, 0xf5,
  0x00, 0x70, 0xc4, 0xf8, 0x00, 0x01, 0xd4, 0xf8, 0x0c, 0x01, 0x20, 0xf4,
  0x60, 0x30, 0x00, 0xf5, 0x80, 0x30, 0x57, 0xe0, 0x05, 0x20, 0xff, 0xf7,
  0x71, 0xfc, 0xd4, 0xf8, 0x08, 0x01, 0x04, 0xf5, 0x80, 0x74, 0xc0, 0xb2,
  0x40, 0xf0, 0x40, 0x00, 0x00, 0x90, 0x06, 0x20, 0xff, 0xf7, 0x66, 0xfc,
  0x01, 0x22, 0x69, 0x46, 0x10, 0x46, 0xff, 0xf7, 0x3c, 0xfd, 0x28, 0x46,
  0xff, 0xf7, 0x61, 0xfe, 0x20, 0x68, 0x20, 0xf4, 0x7f, 0x00, 0x00, 0xf5,
  0x6b, 0x00, 0x20, 0x60, 0x20, 0x68, 0x20, 0xf4, 0xe0, 0x60, 0x00, 0xf5,
  0x00, 0x70, 0x20, 0x60, 0xe0, 0x68, 0x20, 0xf4, 0x60, 0x30, 0x00, 0xf5,
  0xc0, 0x30, 0x52, 0xe7, 0x4f, 0x20, 0x02, 0x90, 0x06, 0x20, 0xff, 0xf7,
  0x47, 0xfc, 0x01, 0x22, 0x81, 0x20, 0x02, 0xa9, 0xff, 0xf7, 0x1d, 0xfd,
  0x28, 0x46, 0xff, 0xf7, 0x42, 0xfe, 0x7f, 0x20, 0x02, 0x90, 0x06, 0x20,
  0xff, 0xf7, 0x3a, 0xfc, 0x01, 0x22, 0x61, 0x20, 0x02, 0xa9, 0xff, 0xf7,
  0x10, 0xfd, 0x28, 0x46, 0xff, 0xf7, 0x35, 0xfe, 0xd4, 0xf8, 0x00, 0x01,
  0x20, 0xf4, 0x7f, 0x00, 0x00, 0xf5, 0x30, 0x20, 0xc4, 0xf8, 0x00, 0x01,
  0xd4, 0xf8, 0x00, 0x01, 0x20, 0xf4, 0xe0, 0x60, 0x00, 0xf5, 0x80, 0x70,
  0xc4, 0xf8, 0x00, 0x01, 0xd4, 0xf8, 0x0c, 0x01, 0x20, 0xf4, 0x60, 0x30,
  0x00, 0xf5, 0x00, 0x40, 0xc4, 0xf8, 0x0c, 0x01, 0xd4, 0xf8, 0x0c, 0x01,
  0x20, 0xf4, 0x80, 0x20, 0xc4, 0xf8, 0x0c, 0x01, 0x7e, 0xbd, 0x2d, 0xe9,
  0xfe, 0x4f, 0x4f, 0xf0, 0x00, 0x05, 0x04, 0x00, 0x2e, 0x46, 0x00, 0x95,
  0x01, 0x95, 0x26, 0xd0, 0x26, 0x70, 0xa6, 0x70, 0x66, 0x70, 0xff, 0xf7,
  0x2e, 0xfe, 0x03, 0x22, 0x9f, 0x20, 0x02, 0xa9, 0xff, 0xf7, 0x91, 0xfd,
  0x02, 0x98, 0x01, 0x27, 0x04, 0x23, 0x4f, 0xf0, 0x03, 0x08, 0x4f, 0xf0,
  0x05, 0x09, 0x4f, 0xf0, 0x07, 0x0b, 0xc0, 0xf3, 0x07, 0x42, 0x4f, 0xf0,
  0x02, 0x0c, 0xc0, 0xf3, 0x07, 0x21, 0xc2, 0x2a, 0x00, 0xf0, 0x1f, 0x00,
  0x0d, 0xd0, 0x20, 0x2a, 0x4e, 0xd0, 0xbf, 0x2a, 0x4f, 0xd0, 0x01, 0x2a,
  0x6b, 0xd0, 0xef, 0x2a, 0x74, 0xd0, 0x9d, 0x2a, 0x7f, 0xd0, 0x01, 0x25,
  0x28, 0x46, 0xbd, 0xe8, 0xfe, 0x8f, 0x25, 0x29, 0x4f, 0xf0, 0x06, 0x0a,
  0x1c, 0xd0, 0x28, 0x29, 0x1c, 0xd0, 0x20, 0x29, 0x1d, 0xd0, 0x23, 0x29,
  0x1d, 0xd0, 0x0b, 0x22, 0x86, 0x29, 0x1d, 0xd0, 0x85, 0x29, 0x1b, 0xd0,
  0x80, 0x29, 0x19, 0xd0, 0x01, 0x25, 0x15, 0x28, 0x18, 0xd0, 0x16, 0x28,
  0x18, 0xd0, 0x17, 0x28, 0x19, 0xd0, 0x18, 0x28, 0x1a, 0xd0, 0x19, 0x28,
  0x1a, 0xd0, 0x1a, 0x28, 0x1b, 0xd0, 0x1b, 0x28, 0x1c, 0xd0, 0x1e, 0xe0,
  0x27, 0x70, 0xee, 0xe7, 0x84, 0xf8, 0x00, 0xa0, 0xeb, 0xe7, 0x08, 0x21,
  0x00, 0xe0, 0x09, 0x21, 0x21, 0x70, 0xe6, 0xe7, 0x22, 0x70, 0xe4, 0xe7,
  0xa7, 0x70, 0x11, 0xe0, 0x84, 0xf8, 0x02, 0xc0, 0x0e, 0xe0, 0x84, 0xf8,
  0x02, 0x80, 0x0b, 0xe0, 0xa3, 0x70, 0x09, 0xe0, 0x84, 0xf8, 0x02, 0x90,
  0x06, 0xe0, 0x84, 0xf8, 0x02, 0xa0, 0x03, 0xe0, 0x84, 0xf8, 0x02, 0xb0,
  0x00, 0xe0, 0xa6, 0x70, 0x63, 0x70, 0xb9, 0xe7, 0x84, 0xf8, 0x00, 0x80,
  0xb6, 0xe7, 0x01, 0x28, 0x23, 0x70, 0x15, 0xd0, 0x02, 0x28, 0x15, 0xd0,
  0xa6, 0x70, 0x20, 0x46, 0x63, 0x70, 0xff, 0xf7, 0x11, 0xfe, 0x06, 0x20,
  0xff, 0xf7, 0x8c, 0xfb, 0x08, 0x22, 0x69, 0x46, 0x42, 0x20, 0xff, 0xf7,
  0x62, 0xfc, 0x20, 0x46, 0xff, 0xf7, 0x87, 0xfd, 0x20, 0x46, 0xff, 0xf7,
  0xcb, 0xfd, 0x9d, 0xe7, 0xa7, 0x70, 0xea, 0xe7, 0x84, 0xf8, 0x02, 0xc0,
  0xe7, 0xe7, 0x15, 0x28, 0x84, 0xf8, 0x00, 0x90, 0xc4, 0xd0, 0x16, 0x28,
  0xc4, 0xd0, 0x17, 0x28, 0xd3, 0xd1, 0xc4, 0xe7, 0x00, 0xe0, 0x0c, 0xe0,
  0x15, 0x28, 0x84, 0xf8, 0x00, 0xc0, 0xb9, 0xd0, 0x16, 0x28, 0xb9, 0xd0,
  0x17, 0x28, 0xba, 0xd0, 0x18, 0x28, 0xbb, 0xd0, 0x19, 0x28, 0xc4, 0xd1,
  0xba, 0xe7, 0x40, 0x29, 0x09, 0xd0, 0x60, 0x29, 0x0a, 0xd0, 0x70, 0x29,
  0x08, 0xd0, 0x01, 0x25, 0x15, 0x28, 0xa7, 0xd0, 0x16, 0x28, 0xb8, 0xd1,
  0xa6, 0xe7, 0x84, 0xf8, 0x00, 0xb0, 0xf7, 0xe7, 0x0a, 0x21, 0x21, 0x70,
  0xf4, 0xe7, 0x18, 0xb5, 0x05, 0x20, 0x4f, 0xf0, 0x50, 0x44, 0xff, 0xf7,
  0x4b, 0xfb, 0xd4, 0xf8, 0x08, 0x01, 0x40, 0xf0, 0x40, 0x00, 0x00, 0x90,
  0x06, 0x20, 0xff, 0xf7, 0x43, 0xfb, 0x01, 0x22, 0x69, 0x46, 0x10, 0x46,
  0xff, 0xf7, 0x19, 0xfc, 0x18, 0xbd, 0x4f, 0xf0, 0x50, 0x41, 0xd1, 0xf8,
  0x00, 0x21, 0x60, 0xf3, 0x0a, 0x22, 0xc1, 0xf8, 0x00, 0x21, 0x70, 0x47,
  0x00, 0x78, 0xbe, 0x49, 0x51, 0xf8, 0x20, 0x00, 0x00, 0x47, 0x4f, 0xf0,
  0x50, 0x40, 0x00, 0xb5, 0x0a, 0x04, 0xd0, 0xf8, 0x04, 0x11, 0x62, 0xf3,
  0x17, 0x01, 0xc0, 0xf8, 0x04, 0x11, 0x06, 0x20, 0xff, 0xf7, 0x22, 0xfb,
  0x5d, 0xf8, 0x04, 0xeb, 0xd8, 0x20, 0xff, 0xf7, 0x1d, 0xbb, 0x4f, 0xf0,
  0x50, 0x40, 0x00, 0xb5, 0x0a, 0x03, 0xd0, 0xf8, 0x04, 0x11, 0x62, 0xf3,
  0x17, 0x01, 0xc0, 0xf8, 0x04, 0x11, 0x06, 0x20, 0xff, 0xf7, 0x10, 0xfb,
  0x5d, 0xf8, 0x04, 0xeb, 0x20, 0x20, 0xff, 0xf7, 0x0b, 0xbb, 0xa0, 0xf1,
  0x80, 0x50, 0x00, 0x0c, 0x08, 0x60, 0x70, 0x47, 0xa0, 0xf1, 0x80, 0x50,
  0x00, 0x0b, 0x08, 0x60, 0x70, 0x47, 0x2d, 0xe9, 0xff, 0x5f, 0xa2, 0xf1,
  0x80, 0x55, 0x1e, 0x46, 0x0f, 0x46, 0x4f, 0xf0, 0xff, 0x3a, 0xa9, 0x19,
  0x49, 0x1e, 0x4f, 0xf0, 0x50, 0x44, 0x09, 0x0a, 0xa1, 0xeb, 0x15, 0x20,
  0x5f, 0xea, 0x00, 0x09, 0x50, 0xd0, 0xe8, 0xb2, 0x39, 0x46, 0xc0, 0xf5,
  0x80, 0x70, 0x80, 0x46, 0x02, 0x46, 0x20, 0x46, 0x00, 0xf0, 0xb2, 0xfc,
  0xd4, 0xf8, 0x04, 0x01, 0x0a, 0xeb, 0x98, 0x01, 0x61, 0xf3, 0x1f, 0x60,
  0xc4, 0xf8, 0x04, 0x01, 0xd4, 0xf8, 0x04, 0x01, 0x65, 0xf3, 0x17, 0x00,
  0xc4, 0xf8, 0x04, 0x01, 0x06, 0x20, 0xff, 0xf7, 0xd5, 0xfa, 0x02, 0x20,
  0xff, 0xf7, 0xd2, 0xfa, 0x00, 0x98, 0xff, 0xf7, 0xd2, 0xfc, 0xa6, 0xeb,
  0x08, 0x06, 0x45, 0x44, 0x28, 0xf0, 0x03, 0x00, 0x4f, 0xf0, 0x01, 0x08,
  0x07, 0x44, 0x4f, 0xf4, 0x80, 0x7b, 0x23, 0xe0, 0x5a, 0x46, 0x39, 0x46,
  0x20, 0x46, 0x00, 0xf0, 0x8b, 0xfc, 0xd4, 0xf8, 0x04, 0x01, 0x20, 0xf0,
  0x7f, 0x40, 0x00, 0xf1, 0x7c, 0x50, 0xc4, 0xf8, 0x04, 0x01, 0xd4, 0xf8,
  0x04, 0x01, 0x65, 0xf3, 0x17, 0x00, 0xc4, 0xf8, 0x04, 0x01, 0x06, 0x20,
  0xff, 0xf7, 0xae, 0xfa, 0x02, 0x20, 0xff, 0xf7, 0xab, 0xfa, 0x00, 0x98,
  0xff, 0xf7, 0xab, 0xfc, 0x08, 0xf1, 0x01, 0x08, 0x05, 0xf5, 0x80, 0x75,
  0xa6, 0xf5, 0x80, 0x76, 0x07, 0xf5, 0x80, 0x77, 0xc8, 0x45, 0xd9, 0xd3,
  0x00, 0x2e, 0x1d, 0xd0, 0x32, 0x46, 0x39, 0x46, 0x20, 0x46, 0x00, 0xf0,
  0x63, 0xfc, 0xd4, 0xf8, 0x04, 0x01, 0x0a, 0xeb, 0x96, 0x01, 0x61, 0xf3,
  0x1f, 0x60, 0xc4, 0xf8, 0x04, 0x01, 0xd4, 0xf8, 0x04, 0x01, 0x65, 0xf3,
  0x17, 0x00, 0xc4, 0xf8, 0x04, 0x01, 0x06, 0x20, 0xff, 0xf7, 0x86, 0xfa,
  0x02, 0x20, 0xff, 0xf7, 0x83, 0xfa, 0x00, 0x98, 0x04, 0xb0, 0xbd, 0xe8,
  0xf0, 0x5f, 0x80, 0xe4, 0xbd, 0xe8, 0xff, 0x9f, 0x2d, 0xe9, 0xfc, 0x41,
  0x04, 0x78, 0x4f, 0xf0, 0x50, 0x47, 0x8c, 0x46, 0x80, 0x46, 0x05, 0x20,
  0xff, 0xf7, 0x72, 0xfa, 0xd7, 0xf8, 0x08, 0x01, 0x01, 0x2c, 0x0c, 0xf0,
  0x0f, 0x06, 0xc5, 0xb2, 0x23, 0xd0, 0x02, 0x2c, 0x24, 0xd0, 0x03, 0x2c,
  0x38, 0xd0, 0x06, 0x2c, 0x40, 0xd0, 0x05, 0x2c, 0x53, 0xd0, 0x07, 0x2c,
  0x19, 0xd0, 0x0a, 0x2c, 0x17, 0xd0, 0x08, 0x2c, 0x01, 0xd0, 0x09, 0x2c,
  0x2a, 0xd1, 0x05, 0x20, 0xff, 0xf7, 0x58, 0xfa, 0xd7, 0xf8, 0x08, 0x01,
  0x05, 0xf0, 0xc0, 0x01, 0x41, 0xea, 0x86, 0x01, 0xc0, 0xb2, 0x40, 0xf0,
  0x08, 0x00, 0x41, 0xea, 0x00, 0x20, 0x00, 0x90, 0x06, 0x20, 0xff, 0xf7,
  0x49, 0xfa, 0x02, 0x22, 0x0f, 0xe0, 0x05, 0xf0, 0xc0, 0x00, 0x17, 0xe0,
  0x05, 0xf0, 0x80, 0x00, 0x40, 0xea, 0x86, 0x00, 0x00, 0x90, 0x35, 0x20,
  0xff, 0xf7, 0x3c, 0xfa, 0xd7, 0xf8, 0x08, 0x01, 0x00, 0x99, 0xc0, 0xb2,
  0xe7, 0xe7, 0x01, 0x20, 0x69, 0x46, 0xff, 0xf7, 0x0e, 0xfb, 0x40, 0x46,
  0xff, 0xf7, 0x33, 0xfc, 0xbd, 0xe8, 0xfc, 0x81, 0x05, 0xf0, 0x80, 0x00,
  0x40, 0xea, 0x86, 0x00, 0x00, 0x90, 0x06, 0x20, 0xff, 0xf7, 0x26, 0xfa,
  0x01, 0x22, 0xec, 0xe7, 0x00, 0x20, 0x01, 0x90, 0x05, 0xf0, 0xc0, 0x00,
  0x40, 0xea, 0x86, 0x04, 0x02, 0x22, 0x15, 0x20, 0x01, 0xa9, 0xff, 0xf7,
  0xaa, 0xfb, 0x01, 0x98, 0x00, 0xf4, 0x7f, 0x41, 0xc0, 0xb2, 0x41, 0xea,
  0x00, 0x40, 0x20, 0x43, 0x40, 0xf4, 0x00, 0x60, 0x19, 0xe0, 0x0c, 0xf0,
  0x1f, 0x01, 0x05, 0xf0, 0x80, 0x00, 0x40, 0xea, 0x81, 0x00, 0x00, 0x90,
  0x35, 0x20, 0xff, 0xf7, 0x05, 0xfa, 0xd7, 0xf8, 0x08, 0x01, 0x40, 0xf0,
  0xff, 0x04, 0x33, 0x20, 0xff, 0xf7, 0xfe, 0xf9, 0xd7, 0xf8, 0x08, 0x01,
  0x00, 0x99, 0x40, 0xf0, 0xff, 0x00, 0x00, 0x04, 0x40, 0xea, 0x04, 0x20,
  0x08, 0x43, 0x00, 0x90, 0x06, 0x20, 0xff, 0xf7, 0xf1, 0xf9, 0x03, 0x22,
  0xb7, 0xe7, 0xf8, 0xb5, 0x04, 0x78, 0x00, 0x25, 0x05, 0x20, 0x4f, 0xf0,
  0x50, 0x47, 0xff, 0xf7, 0xe7, 0xf9, 0xd7, 0xf8, 0x08, 0x01, 0x01, 0x2c,
  0xc6, 0xb2, 0x27, 0xd0, 0x02, 0x2c, 0x0e, 0xd0, 0x03, 0x2c, 0x0c, 0xd0,
  0x05, 0x2c, 0x0d, 0xd0, 0x06, 0x2c, 0x0d, 0xd0, 0x07, 0x2c, 0x1d, 0xd0,
  0x0a, 0x2c, 0x1b, 0xd0, 0x08, 0x2c, 0x0d, 0xd0, 0x09, 0x2c, 0x0b, 0xd0,
  0x18, 0xe0, 0xc6, 0xf3, 0x84, 0x05, 0x15, 0xe0, 0xb5, 0x08, 0x13, 0xe0,
  0x02, 0x22, 0x69, 0x46, 0x15, 0x20, 0xff, 0xf7, 0x58, 0xfb, 0x0b, 0xe0,
  0x05, 0x20, 0xff, 0xf7, 0xc3, 0xf9, 0xd7, 0xf8, 0x08, 0x01, 0x00, 0x07,
  0x04, 0xd5, 0xc6, 0xf3, 0x83, 0x00, 0x40, 0xf0, 0x10, 0x05, 0x01, 0xe0,
  0xc6, 0xf3, 0x83, 0x05, 0x28, 0x46, 0xf8, 0xbd, 0x1c, 0x19, 0x00, 0x00,
  0x01, 0x6d, 0x21, 0xf0, 0x06, 0x01, 0x01, 0x65, 0x01, 0x6d, 0x21, 0xf0,
  0x18, 0x01, 0x01, 0x65, 0x01, 0x6d, 0x21, 0xf0, 0x01, 0x01, 0x01, 0x65,
  0x70, 0x47, 0x00, 0x21, 0xc1, 0x61, 0xc1, 0x62, 0x81, 0x63, 0x01, 0x63,
  0x41, 0x60, 0x41, 0x63, 0xea, 0xe7, 0x01, 0x6b, 0x01, 0xf0, 0x01, 0x02,
  0x01, 0x6b, 0x41, 0xf0, 0x01, 0x01, 0x01, 0x63, 0x81, 0x69, 0x09, 0x06,
  0xfc, 0xd5, 0x41, 0x6c, 0x41, 0xf0, 0x20, 0x01, 0x41, 0x64, 0x01, 0x6b,
  0x62, 0xf3, 0x00, 0x01, 0x01, 0x63, 0x70, 0x47, 0x08, 0xb5, 0x01, 0x6b,
  0x01, 0xf0, 0x01, 0x02, 0x01, 0x6b, 0x41, 0xf0, 0x01, 0x01, 0x01, 0x63,
  0x03, 0xe0, 0x01, 0x68, 0xc9, 0xb2, 0xad, 0xf8, 0x00, 0x10, 0x81, 0x69,
  0xc9, 0x06, 0xf8, 0xd5, 0x41, 0x6c, 0x41, 0xf0, 0x40, 0x01, 0x41, 0x64,
  0x41, 0x6c, 0x41, 0xf0, 0x10, 0x01, 0x41, 0x64, 0x01, 0x6b, 0x62, 0xf3,
  0x00, 0x01, 0x01, 0x63, 0x08, 0xbd, 0x30, 0xb5, 0x05, 0x6b, 0x04, 0x46,
  0x00, 0x6b, 0x20, 0xf0, 0x01, 0x00, 0x20, 0x63, 0xe0, 0x69, 0x40, 0xf0,
  0x10, 0x00, 0xe0, 0x61, 0xe0, 0x6a, 0x40, 0xf0, 0x10, 0x00, 0xe0, 0x62,
  0x20, 0x46, 0xff, 0xf7, 0xd1, 0xff, 0x20, 0x46, 0xff, 0xf7, 0xbb, 0xff,
  0x20, 0x6b, 0x65, 0xf3, 0x00, 0x00, 0x20, 0x63, 0x30, 0xbd, 0xf0, 0xb5,
  0x4f, 0xf4, 0x80, 0x64, 0x83, 0x69, 0x1b, 0x07, 0xfc, 0xd4, 0x88, 0x4b,
  0x4f, 0xf4, 0xe1, 0x15, 0x9a, 0x42, 0x02, 0xd8, 0xa9, 0x42, 0x02, 0xd3,
  0x05, 0xe0, 0xa9, 0x42, 0x00, 0xd2, 0x00, 0x24, 0x01, 0x23, 0x52, 0x08,
  0x00, 0xe0, 0x00, 0x23, 0x05, 0x6b, 0x64, 0x26, 0xb1, 0xfb, 0xf6, 0xf1,
  0xb2, 0xfb, 0xf6, 0xf2, 0x05, 0xf0, 0x01, 0x05, 0xc9, 0x02, 0x12, 0x01,
  0xb1, 0xfb, 0xf2, 0xf2, 0xd1, 0x0a, 0xc2, 0xf3, 0x0a, 0x02, 0x04, 0xeb,
  0x82, 0x12, 0x3f, 0x24, 0xb4, 0xeb, 0xd2, 0x2f, 0x00, 0xd2, 0x49, 0x1c,
  0xc4, 0x69, 0xc2, 0xf3, 0xc5, 0x22, 0xc6, 0x6a, 0x07, 0x6b, 0x27, 0xf0,
  0x01, 0x07, 0x07, 0x63, 0x07, 0x6b, 0x63, 0xf3, 0xc3, 0x07, 0x07, 0x63,
  0x89, 0xb2, 0x41, 0x62, 0x82, 0x62, 0xc4, 0x61, 0xc6, 0x62, 0x01, 0x6b,
  0x65, 0xf3, 0x00, 0x01, 0x01, 0x63, 0xf0, 0xbd, 0x02, 0x6b, 0x02, 0xf0,
  0x01, 0x03, 0x02, 0x6b, 0x42, 0xf0, 0x01, 0x02, 0x02, 0x63, 0x82, 0x69,
  0x12, 0x07, 0xfc, 0xd4, 0x02, 0x6b, 0x22, 0xf0, 0x01, 0x02, 0x02, 0x63,
  0xc2, 0x69, 0x61, 0xf3, 0x46, 0x12, 0xc2, 0x61, 0xc2, 0x6a, 0x61, 0xf3,
  0x46, 0x12, 0xc2, 0x62, 0x01, 0x6b, 0x63, 0xf3, 0x00, 0x01, 0x01, 0x63,
  0x70, 0x47, 0x02, 0x6b, 0x02, 0xf0, 0x01, 0x03, 0x02, 0x6b, 0x42, 0xf0,
  0x01, 0x02, 0x02, 0x63, 0x82, 0x69, 0x12, 0x07, 0xfc, 0xd4, 0x02, 0x6b,
  0x22, 0xf0, 0x01, 0x02, 0x02, 0x63, 0x42, 0x6b, 0x61, 0xf3, 0xc5, 0x02,
  0x42, 0x63, 0x01, 0x6b, 0x63, 0xf3, 0x00, 0x01, 0x01, 0x63, 0x70, 0x47,
  0x02, 0x6b, 0x02, 0xf0, 0x01, 0x03, 0x02, 0x6b, 0x42, 0xf0, 0x01, 0x02,
  0x02, 0x63, 0x82, 0x69, 0x12, 0x07, 0xfc, 0xd4, 0x02, 0x6b, 0x22, 0xf0,
  0x01, 0x02, 0x02, 0x63, 0x42, 0x6b, 0x61, 0xf3, 0x02, 0x02, 0x42, 0x63,
  0x01, 0x6b, 0x63, 0xf3, 0x00, 0x01, 0x01, 0x63, 0x70, 0x47, 0x01, 0x6b,
  0x41, 0xf4, 0x00, 0x71, 0x01, 0x63, 0x70, 0x47, 0x01, 0x6b, 0x41, 0xf4,
  0x80, 0x71, 0x01, 0x63, 0x70, 0x47, 0x01, 0x6b, 0x41, 0xf0, 0x01, 0x01,
  0x01, 0x63, 0x70, 0x47, 0x70, 0xb5, 0x05, 0x6b, 0x00, 0x24, 0x23, 0x46,
  0x22, 0x46, 0x05, 0xf0, 0x01, 0x06, 0x05, 0x6b, 0x45, 0xf0, 0x01, 0x05,
  0x05, 0x63, 0x85, 0x69, 0x2d, 0x07, 0xfc, 0xd4, 0x05, 0x6b, 0x25, 0xf0,
  0x01, 0x05, 0x05, 0x63, 0x02, 0x29, 0x06, 0xd0, 0x01, 0x29, 0x07, 0xd0,
  0x04, 0x29, 0x09, 0xd0, 0x03, 0x29, 0x0a, 0xd0, 0x0c, 0xe0, 0x01, 0x24,
  0x00, 0x23, 0x01, 0xe0, 0x01, 0x24, 0x23, 0x46, 0x00, 0x22, 0x05, 0xe0,
  0x01, 0x24, 0x23, 0x46, 0x01, 0xe0, 0x01, 0x24, 0x00, 0x23, 0x01, 0x22,
  0xc1, 0x69, 0x64, 0xf3, 0x41, 0x01, 0xc1, 0x61, 0xc1, 0x69, 0x63, 0xf3,
  0x82, 0x01, 0xc1, 0x61, 0xc1, 0x69, 0x62, 0xf3, 0xc7, 0x11, 0xc1, 0x61,
  0xc1, 0x6a, 0x64, 0xf3, 0x41, 0x01, 0xc1, 0x62, 0xc1, 0x6a, 0x63, 0xf3,
  0x82, 0x01, 0xc1, 0x62, 0xc1, 0x6a, 0x62, 0xf3, 0xc7, 0x11, 0xc1, 0x62,
  0x01, 0x6b, 0x66, 0xf3, 0x00, 0x01, 0x01, 0x63, 0x70, 0xbd, 0x02, 0x6b,
  0x02, 0xf0, 0x01, 0x03, 0x02, 0x6b, 0x42, 0xf0, 0x01, 0x02, 0x02, 0x63,
  0x82, 0x69, 0x12, 0x07, 0xfc, 0xd4, 0x02, 0x6b, 0x22, 0xf0, 0x01, 0x02,
  0x02, 0x63, 0xc2, 0x69, 0x61, 0xf3, 0xc3, 0x02, 0xc2, 0x61, 0xc2, 0x6a,
  0x61, 0xf3, 0xc3, 0x02, 0xc2, 0x62, 0x01, 0x6b, 0x63, 0xf3, 0x00, 0x01,
  0x01, 0x63, 0x70, 0x47, 0x80, 0x69, 0xc0, 0xf3, 0xc0, 0x00, 0x70, 0x47,
  0xf0, 0xb5, 0x04, 0x46, 0x1f, 0x46, 0x00, 0x20, 0xdd, 0xe9, 0x05, 0x56,
  0xa0, 0x63, 0x40, 0xf2, 0xff, 0x70, 0x60, 0x64, 0x20, 0x46, 0xff, 0xf7,
  0xf6, 0xfe, 0x39, 0x46, 0x20, 0x46, 0xff, 0xf7, 0xd0, 0xff, 0x29, 0x46,
  0x20, 0x46, 0xff, 0xf7, 0x2f, 0xff, 0x31, 0x46, 0x20, 0x46, 0xbd, 0xe8,
  0xf0, 0x40, 0x81, 0xe7, 0xc0, 0xc6, 0x2d, 0x00, 0xf8, 0xb5, 0xc3, 0x43,
  0x0b, 0x4f, 0x00, 0x24, 0x6e, 0x46, 0x0e, 0xe0, 0x51, 0xf8, 0x24, 0x00,
  0x00, 0x90, 0x00, 0x20, 0x35, 0x5c, 0x40, 0x1c, 0x5d, 0x40, 0xed, 0xb2,
  0x04, 0x28, 0x57, 0xf8, 0x25, 0x50, 0x85, 0xea, 0x13, 0x23, 0xf5, 0xdb,
  0x64, 0x1c, 0xb4, 0xeb, 0x92, 0x0f, 0xed, 0xd3, 0xd8, 0x43, 0xf8, 0xbd,
  0x64, 0x19, 0x00, 0x00, 0x10, 0xb5, 0x00, 0xf0, 0x0f, 0xf9, 0xff, 0xf7,
  0x0a, 0xf8, 0x00, 0x20, 0x10, 0xbd, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x41,
  0xe8, 0x4c, 0x88, 0xb0, 0xe0, 0x68, 0x03, 0x90, 0x20, 0x69, 0x4f, 0xf4,
  0xa0, 0x55, 0x03, 0x99, 0x02, 0x95, 0x00, 0xeb, 0x01, 0x08, 0x20, 0x68,
  0x06, 0x90, 0x02, 0x20, 0xfe, 0xf7, 0xcd, 0xff, 0x02, 0x20, 0xfe, 0xf7,
  0xde, 0xff, 0xe0, 0x4f, 0x4f, 0xf0, 0x00, 0x76, 0x00, 0x22, 0x31, 0x46,
  0x38, 0x46, 0xfe, 0xf7, 0x55, 0xff, 0x01, 0x22, 0x31, 0x46, 0x38, 0x46,
  0xfe, 0xf7, 0x46, 0xff, 0x31, 0x46, 0x38, 0x46, 0x00, 0xf0, 0x00, 0xfa,
  0xff, 0xf7, 0x9f, 0xfc, 0x01, 0x22, 0x31, 0x46, 0x38, 0x46, 0xfe, 0xf7,
  0x45, 0xff, 0x05, 0xa8, 0xff, 0xf7, 0xd5, 0xfb, 0x05, 0xa8, 0xff, 0xf7,
  0xf6, 0xfd, 0x18, 0xb1, 0x00, 0x21, 0x05, 0xa8, 0xff, 0xf7, 0x64, 0xfd,
  0x20, 0x7e, 0x00, 0xf0, 0x4a, 0xf9, 0x60, 0x7d, 0x58, 0xb3, 0xe0, 0x7d,
  0x69, 0x46, 0xcc, 0x4e, 0x00, 0x28, 0x03, 0x98, 0x07, 0xd0, 0xff, 0xf7,
  0xcd, 0xfc, 0x03, 0x98, 0x01, 0xa9, 0x30, 0x44, 0xff, 0xf7, 0xc8, 0xfc,
  0x18, 0xe0, 0xff, 0xf7, 0xc0, 0xfc, 0x03, 0x98, 0x01, 0xa9, 0x30, 0x44,
  0xff, 0xf7, 0xbb, 0xfc, 0x10, 0xe0, 0xe0, 0x7d, 0x00, 0x28, 0x05, 0xa8,
  0x02, 0xd0, 0xff, 0xf7, 0xa2, 0xfc, 0x01, 0xe0, 0xff, 0xf7, 0x8d, 0xfc,
  0x05, 0xa8, 0xff, 0xf7, 0x85, 0xfc, 0x01, 0x28, 0xfa, 0xd0, 0x00, 0x98,
  0x40, 0x1c, 0x00, 0x90, 0xdd, 0xe9, 0x00, 0x10, 0x81, 0x42, 0xea, 0xd9,
  0x2f, 0xe0, 0xa0, 0x7d, 0x78, 0xbb, 0xe0, 0x7d, 0x69, 0x46, 0x00, 0x28,
  0x03, 0x98, 0x09, 0xd0, 0xff, 0xf7, 0xa0, 0xfc, 0x21, 0x68, 0x03, 0x98,
  0x40, 0x1e, 0x08, 0x44, 0x01, 0xa9, 0xff, 0xf7, 0x99, 0xfc, 0x1a, 0xe0,
  0xff, 0xf7, 0x91, 0xfc, 0x21, 0x68, 0x03, 0x98, 0x40, 0x1e, 0x08, 0x44,
  0x01, 0xa9, 0xff, 0xf7, 0x8a, 0xfc, 0x10, 0xe0, 0xe0, 0x7d, 0x00, 0x28,
  0x05, 0xa8, 0x02, 0xd0, 0xff, 0xf7, 0x71, 0xfc, 0x01, 0xe0, 0xff, 0xf7,
  0x5c, 0xfc, 0x05, 0xa8, 0xff, 0xf7, 0x54, 0xfc, 0x01, 0x28, 0xfa, 0xd0,
  0x00, 0x98, 0x40, 0x1c, 0x00, 0x90, 0xdd, 0xe9, 0x00, 0x10, 0x81, 0x42,
  0xea, 0xd9, 0x00, 0xf0, 0xea, 0xf8, 0x20, 0x7d, 0x98, 0xb3, 0xe0, 0x7d,
  0x6f, 0xf0, 0x70, 0x46, 0x00, 0x28, 0xe0, 0x69, 0x69, 0x46, 0x00, 0xf1,
  0x80, 0x50, 0x09, 0xd0, 0xff, 0xf7, 0x6a, 0xfc, 0xe0, 0x69, 0x21, 0x6a,
  0x08, 0x44, 0x30, 0x44, 0x01, 0xa9, 0xff, 0xf7, 0x63, 0xfc, 0x1a, 0xe0,
  0xff, 0xf7, 0x5b, 0xfc, 0xe0, 0x69, 0x21, 0x6a, 0x08, 0x44, 0x30, 0x44,
  0x01, 0xa9, 0xff, 0xf7, 0x54, 0xfc, 0x10, 0xe0, 0xe0, 0x7d, 0x00, 0x28,
  0x05, 0xa8, 0x02, 0xd0, 0xff, 0xf7, 0x3b, 0xfc, 0x01, 0xe0, 0xff, 0xf7,
  0x26, 0xfc, 0x05, 0xa8, 0xff, 0xf7, 0x1e, 0xfc, 0x01, 0x28, 0xfa, 0xd0,
  0x00, 0x98, 0x40, 0x1c, 0x00, 0x90, 0xdd, 0xe9, 0x00, 0x10, 0x81, 0x42,
  0xea, 0xd9, 0x00, 0xf0, 0xb4, 0xf8, 0x60, 0x7d, 0x83, 0x4e, 0xc8, 0xb1,
  0x08, 0xb0, 0xbd, 0xe8, 0xf0, 0x81, 0xa8, 0x42, 0x00, 0xd2, 0x02, 0x90,
  0x80, 0x49, 0x02, 0x9a, 0x70, 0x68, 0xfe, 0xf7, 0x02, 0xfe, 0x7e, 0x49,
  0x05, 0xa8, 0xdd, 0xe9, 0x02, 0x32, 0xff, 0xf7, 0x32, 0xfc, 0xdd, 0xe9,
  0x02, 0x10, 0x08, 0x44, 0x03, 0x90, 0x06, 0x98, 0x40, 0x1a, 0x06, 0x90,
  0x00, 0xf0, 0x97, 0xf8, 0x06, 0x98, 0x00, 0x28, 0xe5, 0xd1, 0x22, 0x68,
  0xa1, 0x68, 0xe0, 0x68, 0xfe, 0xf7, 0x2c, 0xfe, 0x38, 0xb1, 0x00, 0xf0,
  0x9b, 0xf8, 0x70, 0x68, 0xff, 0xf7, 0xc0, 0xfe, 0x00, 0x28, 0xfa, 0xd1,
  0xd4, 0xe7, 0x00, 0xf0, 0x84, 0xf8, 0x70, 0x68, 0xff, 0xf7, 0xb8, 0xfe,
  0x00, 0x28, 0xfa, 0xd1, 0x40, 0x46, 0x00, 0xf0, 0x1f, 0xf9, 0xc9, 0xe7,
  0x2d, 0xe9, 0xf8, 0x43, 0x69, 0x48, 0x4f, 0xf0, 0xba, 0x45, 0x67, 0x4c,
  0x06, 0x68, 0x28, 0x46, 0xfe, 0xf7, 0x78, 0xfe, 0x01, 0x21, 0x28, 0x46,
  0x00, 0x23, 0x0a, 0x46, 0x00, 0x91, 0x19, 0x46, 0xfe, 0xf7, 0x79, 0xfe,
  0x15, 0x20, 0xfe, 0xf7, 0x8f, 0xfe, 0xdf, 0xf8, 0x84, 0x81, 0x01, 0x28,
  0x05, 0x46, 0x03, 0xd1, 0x31, 0x46, 0x40, 0x46, 0xfe, 0xf7, 0x7e, 0xfd,
  0x4f, 0xf0, 0xb0, 0x47, 0x31, 0x46, 0x38, 0x46, 0xfe, 0xf7, 0x78, 0xfd,
  0x55, 0x4e, 0xcc, 0x20, 0x01, 0x2d, 0x30, 0x70, 0x04, 0xd1, 0x01, 0x22,
  0x31, 0x46, 0x40, 0x46, 0xfe, 0xf7, 0x97, 0xfd, 0x50, 0x49, 0x01, 0x22,
  0x38, 0x46, 0xfe, 0xf7, 0x92, 0xfd, 0x01, 0x2d, 0x08, 0xd1, 0x40, 0x46,
  0x00, 0xf0, 0xed, 0xf8, 0x20, 0xb9, 0x40, 0x46, 0x00, 0xf0, 0xef, 0xf8,
  0x4a, 0x28, 0x04, 0xd0, 0x38, 0x46, 0x00, 0xf0, 0xe4, 0xf8, 0x18, 0xb1,
  0x07, 0xe0, 0xc6, 0xf8, 0x04, 0x80, 0x09, 0xe0, 0x38, 0x46, 0x00, 0xf0,
  0xe2, 0xf8, 0x4a, 0x28, 0x03, 0xd0, 0x64, 0x1e, 0xe5, 0xd1, 0xbd, 0xe8,
  0xf8, 0x83, 0x77, 0x60, 0x00, 0xf0, 0x29, 0xf8, 0x00, 0x2c, 0xf8, 0xd0,
  0x3a, 0x49, 0x38, 0x22, 0x70, 0x68, 0xfe, 0xf7, 0x7e, 0xfd, 0x38, 0x48,
  0xfe, 0xf7, 0xcf, 0xfd, 0x10, 0xb1, 0x00, 0xf0, 0x2b, 0xf8, 0x01, 0xe0,
  0x00, 0xf0, 0x19, 0xf8, 0x33, 0x48, 0x41, 0x6a, 0x49, 0xb1, 0x81, 0x6a,
  0x19, 0xb1, 0xc1, 0x6a, 0x40, 0x6b, 0x08, 0x60, 0xe1, 0xe7, 0xbd, 0xe8,
  0xf8, 0x43, 0x00, 0xf0, 0x2a, 0xb8, 0x40, 0x68, 0x00, 0x28, 0xda, 0xd0,
  0x01, 0x28, 0x03, 0xd0, 0xbd, 0xe8, 0xf8, 0x43, 0x00, 0xf0, 0x12, 0xb8,
  0xbd, 0xe8, 0xf8, 0x43, 0x7a, 0xe6, 0x10, 0xb5, 0x29, 0x4c, 0xcc, 0x20,
  0x01, 0x22, 0x21, 0x46, 0x20, 0x70, 0x60, 0x68, 0xfe, 0xf7, 0x41, 0xfd,
  0x60, 0x68, 0xff, 0xf7, 0x2b, 0xfe, 0x00, 0x28, 0xfa, 0xd1, 0x10, 0xbd,
  0x10, 0xb5, 0x22, 0x4c, 0xe6, 0x20, 0x01, 0x22, 0x21, 0x46, 0x20, 0x70,
  0x60, 0x68, 0xfe, 0xf7, 0x32, 0xfd, 0x60, 0x68, 0xff, 0xf7, 0x1c, 0xfe,
  0x00, 0x28, 0xfa, 0xd1, 0x10, 0xbd, 0x18, 0x48, 0x2d, 0xe9, 0xf0, 0x41,
  0xc6, 0x6a, 0x4f, 0xf4, 0xa0, 0x65, 0x04, 0x6b, 0x02, 0x20, 0xfe, 0xf7,
  0x16, 0xfe, 0xfe, 0xf7, 0x54, 0xfd, 0x15, 0x49, 0x01, 0x22, 0x0f, 0x46,
  0x78, 0x68, 0xfe, 0xf7, 0x2c, 0xfd, 0x38, 0x78, 0x4a, 0x28, 0x19, 0xd1,
  0xa8, 0x46, 0x94, 0xb1, 0x44, 0x45, 0x00, 0xd2, 0x25, 0x46, 0x78, 0x68,
  0x2a, 0x46, 0x31, 0x46, 0xfe, 0xf7, 0x31, 0xfd, 0x0b, 0x49, 0x64, 0x1b,
  0x78, 0x68, 0x01, 0x22, 0x06, 0xeb, 0x85, 0x06, 0xfe, 0xf7, 0x17, 0xfd,
  0x38, 0x78, 0xcc, 0x28, 0xeb, 0xd0, 0x78, 0x68, 0xff, 0xf7, 0xec, 0xfd,
  0x00, 0x28, 0xfa, 0xd1, 0x01, 0xe7, 0x00, 0x00, 0x18, 0x00, 0x00, 0x20,
  0x00, 0x80, 0x02, 0x50, 0xff, 0xff, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x20,
  0x00, 0x00, 0x00, 0x30, 0x80, 0x96, 0x98, 0x00, 0x04, 0x00, 0x00, 0x20,
  0x00, 0x40, 0x03, 0x50, 0x10, 0xb5, 0x20, 0x3a, 0xc0, 0xf0, 0x0b, 0x80,
  0xb1, 0xe8, 0x18, 0x50, 0x20, 0x3a, 0xa0, 0xe8, 0x18, 0x50, 0xb1, 0xe8,
  0x18, 0x50, 0xa0, 0xe8, 0x18, 0x50, 0xbf, 0xf4, 0xf5, 0xaf, 0x5f, 0xea,
  0x02, 0x7c, 0x24, 0xbf, 0xb1, 0xe8, 0x18, 0x50, 0xa0, 0xe8, 0x18, 0x50,
  0x44, 0xbf, 0x18, 0xc9, 0x18, 0xc0, 0xbd, 0xe8, 0x10, 0x40, 0x5f, 0xea,
  0x82, 0x7c, 0x24, 0xbf, 0x51, 0xf8, 0x04, 0x3b, 0x40, 0xf8, 0x04, 0x3b,
  0x08, 0xbf, 0x70, 0x47, 0xd2, 0x07, 0x28, 0xbf, 0x31, 0xf8, 0x02, 0x3b,
  0x48, 0xbf, 0x11, 0xf8, 0x01, 0x2b, 0x28, 0xbf, 0x20, 0xf8, 0x02, 0x3b,
  0x48, 0xbf, 0x00, 0xf8, 0x01, 0x2b, 0x70, 0x47, 0x10, 0xb5, 0x04, 0x46,
  0xaf, 0xf3, 0x00, 0x80, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0xfe, 0xf7,
  0x81, 0xbc, 0x70, 0x47, 0x01, 0x49, 0x18, 0x20, 0xab, 0xbe, 0xfe, 0xe7,
  0x26, 0x00, 0x02, 0x00, 0x41, 0x60, 0x70, 0x47, 0x40, 0xf0, 0x01, 0x00,
  0x00, 0x47, 0x80, 0x69, 0xc0, 0xf3, 0x40, 0x10, 0x70, 0x47, 0x80, 0x69,
  0xc0, 0xf3, 0x00, 0x10, 0x70, 0x47, 0x01, 0x70, 0x70, 0x47, 0x00, 0x68,
  0xc0, 0xb2, 0x70, 0x47, 0x40, 0xe0, 0x4f, 0xf0, 0x00, 0x00, 0xdf, 0xf8,
  0x80, 0xb0, 0xcb, 0xf8, 0x00, 0x00, 0xbf, 0xf3, 0x4f, 0x8f, 0xdf, 0xf8,
  0x78, 0xb0, 0xdb, 0xf8, 0x00, 0x20, 0x02, 0xf0, 0x07, 0x01, 0x01, 0xf1,
  0x04, 0x07, 0xc2, 0xf3, 0xc9, 0x04, 0xc2, 0xf3, 0x4e, 0x32, 0xb4, 0xfa,
  0x84, 0xf6, 0xdf, 0xf8, 0x60, 0xb0, 0x21, 0x46, 0x12, 0xfa, 0x07, 0xf8,
  0x11, 0xfa, 0x06, 0xf3, 0x53, 0xea, 0x08, 0x03, 0xcb, 0xf8, 0x00, 0x30,
  0x49, 0x1e, 0xf7, 0xda, 0x52, 0x1e, 0xf2, 0xda, 0xbf, 0xf3, 0x4f, 0x8f,
  0xbf, 0xf3, 0x6f, 0x8f, 0x4f, 0xf0, 0x00, 0x00, 0xdf, 0xf8, 0x38, 0xb0,
  0xcb, 0xf8, 0x00, 0x00, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f,
  0xdf, 0xf8, 0x2c, 0xb0, 0xdb, 0xf8, 0x00, 0x00, 0x40, 0xf4, 0x80, 0x30,
  0x40, 0xf4, 0x00, 0x30, 0xcb, 0xf8, 0x00, 0x00, 0xbf, 0xf3, 0x4f, 0x8f,
  0xbf, 0xf3, 0x6f, 0x8f, 0x05, 0x48, 0x00, 0x47, 0x84, 0xed, 0x00, 0xe0,
  0x80, 0xed, 0x00, 0xe0, 0x60, 0xef, 0x00, 0xe0, 0x50, 0xef, 0x00, 0xe0,
  0x14, 0xed, 0x00, 0xe0, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x89, 0x04, 0x00, 0x00, 0x4b, 0x05, 0x00, 0x00, 0xed, 0x04, 0x00, 0x00,
  0x27, 0x05, 0x00, 0x00, 0x79, 0x05, 0x00, 0x00, 0x89, 0x04, 0x00, 0x00,
  0xa7, 0x05, 0x00, 0x00, 0x89, 0x04, 0x00, 0x00, 0x89, 0x04, 0x00, 0x00,
  0xa7, 0x05, 0x00, 0x00, 0x89, 0x04, 0x00, 0x00, 0x00, 0xb0, 0x75, 0x75,
  0xb0, 0x75, 0xb0, 0x75, 0xb0, 0xb0, 0x75, 0xb0, 0x00, 0x30, 0x7a, 0x7a,
  0x30, 0x7a, 0x30, 0x7a, 0x30, 0x30, 0x7a, 0x30, 0x00, 0x00, 0x00, 0x00,
  0x96, 0x30, 0x07, 0x77, 0x2c, 0x61, 0x0e, 0xee, 0xba, 0x51, 0x09, 0x99,
  0x19, 0xc4, 0x6d, 0x07, 0x8f, 0xf4, 0x6a, 0x70, 0x35, 0xa5, 0x63, 0xe9,
  0xa3, 0x95, 0x64, 0x9e, 0x32, 0x88, 0xdb, 0x0e, 0xa4, 0xb8, 0xdc, 0x79,
  0x1e, 0xe9, 0xd5, 0xe0, 0x88, 0xd9, 0xd2, 0x97, 0x2b, 0x4c, 0xb6, 0x09,
  0xbd, 0x7c, 0xb1, 0x7e, 0x07, 0x2d, 0xb8, 0xe7, 0x91, 0x1d, 0xbf, 0x90,
  0x64, 0x10, 0xb7, 0x1d, 0xf2, 0x20, 0xb0, 0x6a, 0x48, 0x71, 0xb9, 0xf3,
  0xde, 0x41, 0xbe, 0x84, 0x7d, 0xd4, 0xda, 0x1a, 0xeb, 0xe4, 0xdd, 0x6d,
  0x51, 0xb5, 0xd4, 0xf4, 0xc7, 0x85, 0xd3, 0x83, 0x56, 0x98, 0x6c, 0x13,
  0xc0, 0xa8, 0x6b, 0x64, 0x7a, 0xf9, 0x62, 0xfd, 0xec, 0xc9, 0x65, 0x8a,
  0x4f, 0x5c, 0x01, 0x14, 0xd9, 0x6c, 0x06, 0x63, 0x63, 0x3d, 0x0f, 0xfa,
  0xf5, 0x0d, 0x08, 0x8d, 0xc8, 0x20, 0x6e, 0x3b, 0x5e, 0x10, 0x69, 0x4c,
  0xe4, 0x41, 0x60, 0xd5, 0x72, 0x71, 0x67, 0xa2, 0xd1, 0xe4, 0x03, 0x3c,
  0x47, 0xd4, 0x04, 0x4b, 0xfd, 0x85, 0x0d, 0xd2, 0x6b, 0xb5, 0x0a, 0xa5,
  0xfa, 0xa8, 0xb5, 0x35, 0x6c, 0x98, 0xb2, 0x42, 0xd6, 0xc9, 0xbb, 0xdb,
  0x40, 0xf9, 0xbc, 0xac, 0xe3, 0x6c, 0xd8, 0x32, 0x75, 0x5c, 0xdf, 0x45,
  0xcf, 0x0d, 0xd6, 0xdc, 0x59, 0x3d, 0xd1, 0xab, 0xac, 0x30, 0xd9, 0x26,
  0x3a, 0x00, 0xde, 0x51, 0x80, 0x51, 0xd7, 0xc8, 0x16, 0x61, 0xd0, 0xbf,
  0xb5, 0xf4, 0xb4, 0x21, 0x23, 0xc4, 0xb3, 0x56, 0x99, 0x95, 0xba, 0xcf,
  0x0f, 0xa5, 0xbd, 0xb8, 0x9e, 0xb8, 0x02, 0x28, 0x08, 0x88, 0x05, 0x5f,
  0xb2, 0xd9, 0x0c, 0xc6, 0x24, 0xe9, 0x0b, 0xb1, 0x87, 0x7c, 0x6f, 0x2f,
  0x11, 0x4c, 0x68, 0x58, 0xab, 0x1d, 0x61, 0xc1, 0x3d, 0x2d, 0x66, 0xb6,
  0x90, 0x41, 0xdc, 0x76, 0x06, 0x71, 0xdb, 0x01, 0xbc, 0x20, 0xd2, 0x98,
  0x2a, 0x10, 0xd5, 0xef, 0x89, 0x85, 0xb1, 0x71, 0x1f, 0xb5, 0xb6, 0x06,
  0xa5, 0xe4, 0xbf, 0x9f, 0x33, 0xd4, 0xb8, 0xe8, 0xa2, 0xc9, 0x07, 0x78,
  0x34, 0xf9, 0x00, 0x0f, 0x8e, 0xa8, 0x09, 0x96, 0x18, 0x98, 0x0e, 0xe1,
  0xbb, 0x0d, 0x6a, 0x7f, 0x2d, 0x3d, 0x6d, 0x08, 0x97, 0x6c, 0x64, 0x91,
  0x01, 0x5c, 0x63, 0xe6, 0xf4, 0x51, 0x6b, 0x6b, 0x62, 0x61, 0x6c, 0x1c,
  0xd8, 0x30, 0x65, 0x85, 0x4e, 0x00, 0x62, 0xf2, 0xed, 0x95, 0x06, 0x6c,
  0x7b, 0xa5, 0x01, 0x1b, 0xc1, 0xf4, 0x08, 0x82, 0x57, 0xc4, 0x0f, 0xf5,
  0xc6, 0xd9, 0xb0, 0x65, 0x50, 0xe9, 0xb7, 0x12, 0xea, 0xb8, 0xbe, 0x8b,
  0x7c, 0x88, 0xb9, 0xfc, 0xdf, 0x1d, 0xdd, 0x62, 0x49, 0x2d, 0xda, 0x15,
  0xf3, 0x7c, 0xd3, 0x8c, 0x65, 0x4c, 0xd4, 0xfb, 0x58, 0x61, 0xb2, 0x4d,
  0xce, 0x51, 0xb5, 0x3a, 0x74, 0x00, 0xbc, 0xa3, 0xe2, 0x30, 0xbb, 0xd4,
  0x41, 0xa5, 0xdf, 0x4a, 0xd7, 0x95, 0xd8, 0x3d, 0x6d, 0xc4, 0xd1, 0xa4,
  0xfb, 0xf4, 0xd6, 0xd3, 0x6a, 0xe9, 0x69, 0x43, 0xfc, 0xd9, 0x6e, 0x34,
  0x46, 0x88, 0x67, 0xad, 0xd0, 0xb8, 0x60, 0xda, 0x73, 0x2d, 0x04, 0x44,
  0xe5, 0x1d, 0x03, 0x33, 0x5f, 0x4c, 0x0a, 0xaa, 0xc9, 0x7c, 0x0d, 0xdd,
  0x3c, 0x71, 0x05, 0x50, 0xaa, 0x41, 0x02, 0x27, 0x10, 0x10, 0x0b, 0xbe,
  0x86, 0x20, 0x0c, 0xc9, 0x25, 0xb5, 0x68, 0x57, 0xb3, 0x85, 0x6f, 0x20,
  0x09, 0xd4, 0x66, 0xb9, 0x9f, 0xe4, 0x61, 0xce, 0x0e, 0xf9, 0xde, 0x5e,
  0x98, 0xc9, 0xd9, 0x29, 0x22, 0x98, 0xd0, 0xb0, 0xb4, 0xa8, 0xd7, 0xc7,
  0x17, 0x3d, 0xb3, 0x59, 0x81, 0x0d, 0xb4, 0x2e, 0x3b, 0x5c, 0xbd, 0xb7,
  0xad, 0x6c, 0xba, 0xc0, 0x20, 0x83, 0xb8, 0xed, 0xb6, 0xb3, 0xbf, 0x9a,
  0x0c, 0xe2, 0xb6, 0x03, 0x9a, 0xd2, 0xb1, 0x74, 0x39, 0x47, 0xd5, 0xea,
  0xaf, 0x77, 0xd2, 0x9d, 0x15, 0x26, 0xdb, 0x04, 0x83, 0x16, 0xdc, 0x73,
  0x12, 0x0b, 0x63, 0xe3, 0x84, 0x3b, 0x64, 0x94, 0x3e, 0x6a, 0x6d, 0x0d,
  0xa8, 0x5a, 0x6a, 0x7a, 0x0b, 0xcf, 0x0e, 0xe4, 0x9d, 0xff, 0x09, 0x93,
  0x27, 0xae, 0x00, 0x0a, 0xb1, 0x9e, 0x07, 0x7d, 0x44, 0x93, 0x0f, 0xf0,
  0xd2, 0xa3, 0x08, 0x87, 0x68, 0xf2, 0x01, 0x1e, 0xfe, 0xc2, 0x06, 0x69,
  0x5d, 0x57, 0x62, 0xf7, 0xcb, 0x67, 0x65, 0x80, 0x71, 0x36, 0x6c, 0x19,
  0xe7, 0x06, 0x6b, 0x6e, 0x76, 0x1b, 0xd4, 0xfe, 0xe0, 0x2b, 0xd3, 0x89,
  0x5a, 0x7a, 0xda, 0x10, 0xcc, 0x4a, 0xdd, 0x67, 0x6f, 0xdf, 0xb9, 0xf9,
  0xf9, 0xef, 0xbe, 0x8e, 0x43, 0xbe, 0xb7, 0x17, 0xd5, 0x8e, 0xb0, 0x60,
  0xe8, 0xa3, 0xd6, 0xd6, 0x7e, 0x93, 0xd1, 0xa1, 0xc4, 0xc2, 0xd8, 0x38,
  0x52, 0xf2, 0xdf, 0x4f, 0xf1, 0x67, 0xbb, 0xd1, 0x67, 0x57, 0xbc, 0xa6,
  0xdd, 0x06, 0xb5, 0x3f, 0x4b, 0x36, 0xb2, 0x48, 0xda, 0x2b, 0x0d, 0xd8,
  0x4c, 0x1b, 0x0a, 0xaf, 0xf6, 0x4a, 0x03, 0x36, 0x60, 0x7a, 0x04, 0x41,
  0xc3, 0xef, 0x60, 0xdf, 0x55, 0xdf, 0x67, 0xa8, 0xef, 0x8e, 0x6e, 0x31,
  0x79, 0xbe, 0x69, 0x46, 0x8c, 0xb3, 0x61, 0xcb, 0x1a, 0x83, 0x66, 0xbc,
  0xa0, 0xd2, 0x6f, 0x25, 0x36, 0xe2, 0x68, 0x52, 0x95, 0x77, 0x0c, 0xcc,
  0x03, 0x47, 0x0b, 0xbb, 0xb9, 0x16, 0x02, 0x22, 0x2f, 0x26, 0x05, 0x55,
  0xbe, 0x3b, 0xba, 0xc5, 0x28, 0x0b, 0xbd, 0xb2, 0x92, 0x5a, 0xb4, 0x2b,
  0x04, 0x6a, 0xb3, 0x5c, 0xa7, 0xff, 0xd7, 0xc2, 0x31, 0xcf, 0xd0, 0xb5,
  0x8b, 0x9e, 0xd9, 0x2c, 0x1d, 0xae, 0xde, 0x5b, 0xb0, 0xc2, 0x64, 0x9b,
  0x26, 0xf2, 0x63, 0xec, 0x9c, 0xa3, 0x6a, 0x75, 0x0a, 0x93, 0x6d, 0x02,
  0xa9, 0x06, 0x09, 0x9c, 0x3f, 0x36, 0x0e, 0xeb, 0x85, 0x67, 0x07, 0x72,
  0x13, 0x57, 0x00, 0x05, 0x82, 0x4a, 0xbf, 0x95, 0x14, 0x7a, 0xb8, 0xe2,
  0xae, 0x2b, 0xb1, 0x7b, 0x38, 0x1b, 0xb6, 0x0c, 0x9b, 0x8e, 0xd2, 0x92,
  0x0d, 0xbe, 0xd5, 0xe5, 0xb7, 0xef, 0xdc, 0x7c, 0x21, 0xdf, 0xdb, 0x0b,
  0xd4, 0xd2, 0xd3, 0x86, 0x42, 0xe2, 0xd4, 0xf1, 0xf8, 0xb3, 0xdd, 0x68,
  0x6e, 0x83, 0xda, 0x1f, 0xcd, 0x16, 0xbe, 0x81, 0x5b, 0x26, 0xb9, 0xf6,
  0xe1, 0x77, 0xb0, 0x6f, 0x77, 0x47, 0xb7, 0x18, 0xe6, 0x5a, 0x08, 0x88,
  0x70, 0x6a, 0x0f, 0xff, 0xca, 0x3b, 0x06, 0x66, 0x5c, 0x0b, 0x01, 0x11,
  0xff, 0x9e, 0x65, 0x8f, 0x69, 0xae, 0x62, 0xf8, 0xd3, 0xff, 0x6b, 0x61,
  0x45, 0xcf, 0x6c, 0x16, 0x78, 0xe2, 0x0a, 0xa0, 0xee, 0xd2, 0x0d, 0xd7,
  0x54, 0x83, 0x04, 0x4e, 0xc2, 0xb3, 0x03, 0x39, 0x61, 0x26, 0x67, 0xa7,
  0xf7, 0x16, 0x60, 0xd0, 0x4d, 0x47, 0x69, 0x49, 0xdb, 0x77, 0x6e, 0x3e,
  0x4a, 0x6a, 0xd1, 0xae, 0xdc, 0x5a, 0xd6, 0xd9, 0x66, 0x0b, 0xdf, 0x40,
  0xf0, 0x3b, 0xd8, 0x37, 0x53, 0xae, 0xbc, 0xa9, 0xc5, 0x9e, 0xbb, 0xde,
  0x7f, 0xcf, 0xb2, 0x47, 0xe9, 0xff, 0xb5, 0x30, 0x1c, 0xf2, 0xbd, 0xbd,
  0x8a, 0xc2, 0xba, 0xca, 0x30, 0x93, 0xb3, 0x53, 0xa6, 0xa3, 0xb4, 0x24,
  0x05, 0x36, 0xd0, 0xba, 0x93, 0x06, 0xd7, 0xcd, 0x29, 0x57, 0xde, 0x54,
  0xbf, 0x67, 0xd9, 0x23, 0x2e, 0x7a, 0x66, 0xb3, 0xb8, 0x4a, 0x61, 0xc4,
  0x02, 0x1b, 0x68, 0x5d, 0x94, 0x2b, 0x6f, 0x2a, 0x37, 0xbe, 0x0b, 0xb4,
  0xa1, 0x8e, 0x0c, 0xc3, 0x1b, 0xdf, 0x05, 0x5a, 0x8d, 0xef, 0x02, 0x2d,
  0x4c, 0x4c, 0x44, 0x4c, 0x49, 0x42, 0x5f, 0x32, 0x2e, 0x31, 0x2e, 0x30,
  0x5f, 0x41, 0x52, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x28, 0x43, 0x29, 0x32,
  0x30, 0x31, 0x31, 0x2d, 0x32, 0x30, 0x31, 0x36, 0x20, 0x53, 0x54, 0x20,
  0x4d, 0x69, 0x63, 0x72, 0x6f, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x6f,
  0x6e, 0x69, 0x63, 0x73, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x1d, 0x00, 0x00,
  0x08, 0x00, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00,
  0xdc, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x14, 0x00, 0x00,
  0xbc, 0x00, 0x00, 0x00, 0xdc, 0x1d, 0x00, 0x00, 0x18, 0x00, 0x00, 0x20,
  0x38, 0x00, 0x00, 0x00, 0x14, 0x01, 0x00, 0x00, 0x64, 0x1d, 0x00, 0x00,
  0x78, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x01, 0xff, 0x01, 0xff, 0x01, 0xff, 0x01, 0xff, 0x01, 0xff, 0x01, 0xff,
  0x01, 0xff, 0x01, 0xff, 0x01, 0xff, 0x01, 0xff, 0x01, 0xff, 0x01, 0xff,
  0x01, 0xff, 0x01, 0xff, 0x01, 0xff, 0x01, 0xff, 0x01, 0xff, 0x01, 0xff,
  0x01, 0xff, 0x01, 0xff, 0x01, 0x29, 0x00, 0x00]




crc32_tab = \
[
  0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
  0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
  0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
  0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
  0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
  0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
  0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
  0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
  0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
  0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
  0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
  0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
  0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
  0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
  0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
  0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
  0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
  0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
  0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
  0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
  0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
  0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
  0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
  0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
  0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
  0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
  0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
  0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
  0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
  0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
  0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
  0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
  0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
  0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
  0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
  0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
  0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
  0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
  0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
  0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
  0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
  0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
  0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
  0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
  0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
  0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
  0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
  0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
  0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
  0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
  0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
  0x2d02ef8d
]


def calc_crc(payload):
	'''Calculates CRC per 380 manual
	'''
	crc = 0x1D0F
	for bytedata in payload:
		crc = crc^(bytedata << 8) 
		for i in range(0,8):
			if crc&0x8000:
				crc = (crc << 1)^0x1021
			else:
				crc = crc << 1
	crc = crc & 0xffff
	return crc


def sdk_crc(crc32val,bytes,len):
	'''Calculates CRC per 380 manual
	'''
	crc32val = crc32val ^ 0xffffffff;
	#print(int(len/4))
	for i in range(int(len/4)):
		for j in range(4):
			'''
			print(crc32val)
			print(bytes[j])
			print(crc32val ^ bytes[j])
			'''
			#print((crc32val ^ bytes[j]) & 0xff)
			crc32val = crc32_tab[(crc32val ^ bytes[j+4*i]) & 0xff] ^ (crc32val >> 8)
			#print("byte[%d] = %d ,crc32val = %d" % (j,bytes[j],crc32val))

			#print(crc32_tab[(crc32val ^ bytes[j]) & 0xff])
		#print("i= %d,bytes = %02x,crc32val = %d" % (i,bytes[j+4*i],crc32val))
	return crc32val ^ 0xffffffff;	

def get_list_from_int(value):
	value_list = [0 for x in range(0,4)]
	value_list[0] = value & 0xff
	value_list[1] = (value >> 8) & 0xff
	value_list[2] = (value >> 16) & 0xff
	value_list[3] = (value >> 24) & 0xff
	return value_list	

def send_sync(sdk_upload_uart):
	sync = [0xfd,0xc6,0x49,0x28]
	fs.write(bytes(sync))
	sdk_upload_uart.write(sync)
	sleep(0.2)
	rev_wait_count = 10
	while (rev_wait_count > 0):
		R = sdk_upload_uart.read_all()
		if(len(R)) > 0:
			print('len = %d' % len(R))
			if(R[0] == 0x3A) and (R[1] == 0x54) and (R[2] == 0x2c) and(R[3] == 0xA6):
				for ele in R:
					print(hex(ele))
				print('get sync')
				print(len(R))
				return True
			else:
				return False
		else:
			sleep(0.01)
			print('wait')
			rev_wait_count-= 1
	return False

def send_change_baud_cmd(sdk_upload_uart):
	change_baud_cmd = [0x71]
	fs.write(bytes(change_baud_cmd))
	sdk_upload_uart.write(change_baud_cmd)
	print("wait baud")
	rev_wait_count = 10
	while (rev_wait_count > 0):
		R = sdk_upload_uart.read(1)
		if(len(R) > 0):
			print(hex(R[0]))		
			if R[0] == 0xCC:
				print("change baud cmd suc")
				return True
			else:
				print("change baud cmd fail")
				return False
		else:
			sleep(0.01)
			rev_wait_count-= 1
	return False

def send_baud(sdk_upload_uart,baud_int):
	baud_list = []
	baud_list = get_list_from_int(baud_int)
	print('baud_int = %d' % baud_int)
	print(baud_list)
	#baud = [0x00,0x84,0x03,0x00]
	fs.write(bytes(baud_list))
	sdk_upload_uart.write(baud_list)
	rev_wait_count = 10
	while (rev_wait_count > 0):
		R = sdk_upload_uart.read_all()
		if(len(R) > 0):
			print(len(R))
			print(hex(R[0]))	
			if R[0] == 0xCC:
				print("change baud suc")
				sdk_upload_uart.baudrate = baud_int
				return True
			else:
				print("send baud fail")
				return False
		else:
			sleep(0.01)
			print('wait baud')
			rev_wait_count-= 1
	return False

def baud_check(sdk_upload_uart):
	check_baud = [0x38]
	sleep(0.01)
	fs.write(bytes(check_baud))
	sdk_upload_uart.write(check_baud)
	rev_wait_count = 10
	while (rev_wait_count > 0):
		sleep(0.01)
		R = sdk_upload_uart.read(1)
		if(len(R) > 0):
			print(hex(R[0]))	
			if R[0] == 0xCC:
				print("check baud suc")
				return True
			else:
				print("check baud fail")
				return False
		else:
			sleep(0.01)
			rev_wait_count-= 1
	return False



def is_host_ready(sdk_upload_uart):
	host = [0x5a]
	#fs.write(bytes(host))
	sdk_upload_uart.write(host)
	rev_wait_count = 10
	while (rev_wait_count > 0):
		R = sdk_upload_uart.read_all()
		if(len(R)) > 0:
			print('len = %d' % len(R))
			if(R[0] == 0xcc):
				for ele in R:
					print(hex(ele))
				print('get host')
				return True
			else:
				return False
		else:
			sleep(0.01)
			rev_wait_count-= 1
	return False


def send_boot(sdk_upload_uart):
	#4064835977
	boot_size = len(xldr_teseo5_bootloader_cut2)
	boot_size_hex = []
	boot_size_hex = get_list_from_int(boot_size)

	crc_val_boot = 0
	crc_val_boot = sdk_crc(crc_val_boot,boot_size_hex,4)
	entry_hex = [0,0,0,0]
	crc_val_boot = sdk_crc(crc_val_boot,entry_hex,4)
	crc_val_boot = sdk_crc(crc_val_boot,xldr_teseo5_bootloader_cut2,boot_size)
	#crc_val_boot_hex=[0 for x in range(0,4)]
	crc_val_boot_hex=[]
	crc_val_boot_hex = get_list_from_int(crc_val_boot)

	boot_part1 = xldr_teseo5_bootloader_cut2[0:5120]
	boot_part2 = xldr_teseo5_bootloader_cut2[5120:]
	print(len(boot_part1))
	print(len(boot_part2))
	preamble = [0xf4,0x01,0xd5,0xbc,0x73,0x40,0x98,0x83,0x04,0x01,0xff,0x00,0x00,0x00,0x00,0x00]
	sdk_upload_uart.write(preamble)
	sdk_upload_uart.write(crc_val_boot_hex)
	sdk_upload_uart.write(boot_size_hex)
	sdk_upload_uart.write(entry_hex)
	sdk_upload_uart.write(boot_part1)
	sdk_upload_uart.write(boot_part2)
	'''
	fs.write(bytes(preamble))
	fs.write(bytes(crc_val_boot_hex))
	fs.write(bytes(boot_size_hex))
	fs.write(bytes(entry_hex))
	fs.write(bytes(boot_part1))
	fs.write(bytes(boot_part2))
	'''
	rev_wait_count = 30
	while (rev_wait_count > 0):
		R = sdk_upload_uart.read_all()
		if(len(R) > 0):
			print(hex(R[0]))
			if R[0] == 0xCC:
				print('boot suc')
				return True
			else:
				return False
		else:
			print('wait')
			sleep(0.01)
			rev_wait_count-= 1
	return False

def send_write_flash_cmd(sdk_upload_uart):
	write_cmd = [0x4A]
	fs.write(bytes(write_cmd))
	sdk_upload_uart.write(write_cmd)
	print(write_cmd)
	rev_wait_count = 10
	while (rev_wait_count > 0):
		sleep(0.01)
		R = sdk_upload_uart.read(1)
		if(len(R) > 0):
			print(hex(R[0]))
			if R[0] == 0xCC:
				print('flash cmd suc')
				return True
			else:
				print("send write cmd fail")
				return False
		else:
			sleep(0.01)
			rev_wait_count-= 1
	return False


def send_bin_info(sdk_upload_uart,bin_info_list):
	bin_info = \
	[0xec, 0xe5, 0x0c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0a, 0x26, 
	 0xd6, 0xf7, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 
	 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 
	 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,]

	fs.write(bytes(bin_info_list))
	sdk_upload_uart.write(bin_info_list)
	rev_wait_count = 10
	while (rev_wait_count > 0):
		sleep(0.01)
		R = sdk_upload_uart.read_all()
		if(len(R) > 0):
			print(hex(R[0]))
			if R[0] == 0xCC:
				print('send info cmd suc')
				return True
			else:
				print("send bin info fail")
				return False
		else:
			sleep(0.01)
			rev_wait_count-= 1
	return False	

def get_bin_info_list(fs_len,bin_data):
	bootMode = 0x01
	destinationAddress = 0x10000000
	entryPoint = 0
	erase_nvm_u8 = 1
	eraseOnly_u8 = 0
	programOnly_u8 = 0
	subSector_u8 = 0
	sta8090fg_u8 = 0
	res1_8 = 0
	res2_8 = 0
	res3_8 = 0
	nvmoffset = 0x100000
	nvmEraseSize = 0x80000
	debug = 0
	debugAction = 0
	debugAddress = 0
	debugSize = 0
	debugData = 0


	crc_file = 0
	file_size_list = get_list_from_int(fs_len)
	crc_file = sdk_crc(crc_file,file_size_list,4)
	crc_file = sdk_crc(crc_file,bin_data,fs_len)

	bin_info_list = []
	bin_info_list += get_list_from_int(fs_len)
	bin_info_list += get_list_from_int(bootMode)
	bin_info_list += get_list_from_int(crc_file)
	bin_info_list += get_list_from_int(destinationAddress)
	bin_info_list += get_list_from_int(entryPoint)
	bin_info_list.append(erase_nvm_u8)
	bin_info_list.append(eraseOnly_u8)
	bin_info_list.append(programOnly_u8)

	bin_info_list.append(subSector_u8)
	bin_info_list.append(sta8090fg_u8)
	bin_info_list.append(res1_8)
	bin_info_list.append(res2_8)
	bin_info_list.append(res3_8)
	bin_info_list += get_list_from_int(nvmoffset)
	bin_info_list += get_list_from_int(nvmEraseSize)
	bin_info_list += get_list_from_int(debug)
	bin_info_list += get_list_from_int(debugAction)
	bin_info_list += get_list_from_int(debugAddress)
	bin_info_list += get_list_from_int(debugSize)
	bin_info_list += get_list_from_int(debugData)
	#print('len = ---------------%d' % len(bin_info_list))
	print(bin_info_list)
	return bin_info_list


def devinit_wait(sdk_upload_uart):
	rev_wait_count = 500
	while (rev_wait_count > 0):
		sleep(0.01)
		R = sdk_upload_uart.read_all()
		if(len(R) > 0):
			print(hex(R[0]))
			if R[0] == 0xCC:
				print('devinit suc')
				return True
			else:
				print("devinit fail")
				return False
		else:
			sleep(0.01)
			rev_wait_count-= 1
	return False


def erase_wait(sdk_upload_uart):

	rev_wait_count = 500
	while (rev_wait_count > 0):
		sleep(0.01)
		R = sdk_upload_uart.read_all()
		if(len(R) > 0):
			print(hex(R[0]))
			if R[0] == 0xCC:
				print('erase suc')
				return True
			else:
				return False
		else:
			sleep(0.01)
			#print('wait erase')
			rev_wait_count-= 1
	return False

def flash_write(sdk_upload_uart,fs_len,bin_data):
	packet_num = int(fs_len / 5120)
	for i in range(packet_num+1):
		print('flash')
		if i == packet_num:
			data_to_sdk = bin_data[packet_num*5120:]
		else:
			data_to_sdk = bin_data[i*5120:(i+1)*5120]
		fs.write(bytes(data_to_sdk))
		sdk_upload_uart.write(data_to_sdk)
		rev_wait_count = 500
		while rev_wait_count > 0:
			sleep(0.01)
			R = sdk_upload_uart.read_all()
			if(len(R) > 0):
				print(hex(R[0]))
				if R[0] == 0xCC:
					print('send %d packet'% i)
					process = i * 100/packet_num
					break
				else:
					print('write_flash fail')
					return False
			else:
				sleep(0.01)
				#print("rev_wait_count = %d" % rev_wait_count)
				rev_wait_count-= 1
	return True


def flash_crc(sdk_upload_uart):
	rev_wait_count = 100
	while (rev_wait_count > 0):
		sleep(0.01)
		R = sdk_upload_uart.read_all()
		if(len(R) > 0):
			print(hex(R[0]))
			if R[0] == 0xCC:
				print('check crc suc')
				return True
			else:
				print("check flash crc fail")
				return False
		else:
			sleep(0.01)	
			rev_wait_count-= 1
	return False
if __name__ == '__main__':
	print('please set com')
	com_set = input()
	serial = serial.Serial(com_set, 115200, timeout=0.1)  #/dev/ttyUSB0	
	fs = open('log1.bin','wb')
	if serial.isOpen() :
		print("open success")
		start_time = time.time()
	else :
		print("open failed")
	fs_bin = open("sta.bin","rb")
	bin_data = fs_bin.read()
	fs_len = os.path.getsize("./sta.bin")

	bin_info_list = get_bin_info_list(fs_len,bin_data)	
	if send_sync(serial) == False:
		print('sync fail')
	if send_change_baud_cmd(serial) == False:
		print("baud cmd fail")
	if send_baud(serial,230400) == False:
		print('send baud fail')
	if baud_check(serial) == False:
		print('baud check fail')
	if is_host_ready(serial) == False:
		print('host not ready')
	if send_boot(serial) == False:
		print('boot fail')
	if send_write_flash_cmd(serial) == False:
		print('send falsh cmd fail')
	if send_bin_info(serial,bin_info_list) == False:
		print('send bin info fail')
	if devinit_wait(serial) == False:
		print('devinit fail')
	if erase_wait(serial) == False:
		print('erase fail')
	if flash_write(serial,fs_len,bin_data) == False:
		print('flash fail')
	#flash
	#check crc
	if flash_crc(serial) == True:
		print('upgrade suc')
	else:
		print('upgrade fail')
		


		
		